2017-11-25 1 views
0

Ich habe eine MongoDB Sammlung, mit einem Dokument wie -MongoDB Aggregation Abfrage - Gruppe Aggregat Feldfehler

{ 
    "_id" : ObjectId("5a187babdbf0a03cdca0d0bc"), 
    "aggregationDate" : "2017-10-31", 
    "ipaddress" : "10.65.66.184", 
    "first" : { 
     "count" : 3 
    }, 
    "second" : { 
     "count" : 2 
    }, 
    "third" : { 
     "count" : 3 
    }, 
} 

Es gibt rund 30.000 solche Dokumente, mit rund 1000 neuen jedem Tag erzeugt. Ich möchte die "IP-Adresse" mit der höchsten Aktivität anzeigen, die als höchste Anzahl von "ersten", "zweiten" und "dritten" definiert ist. leider einen Fehler

db.collection.aggregate({ $group : { ipaddress: "$ipaddress", 
          max: { $max : [ "$first.count", "$second.count", "$third.count" }}}); 

I - -

sah ich Aggregationsanfragen und schrieb das folgende

"errmsg" : "exception: the group aggregate field 'ipaddress' must be defined as an expression inside an object", 

Kann mir bitte jemand mit diesem Fehler helfen und auch eine Aggregation Abfrage mit Schreiben für meine Anforderung? Ja Dank

+0

Suchen Sie nach höchsten ersten und zweiten und dritten ODER die höchste Summe von ersten, zweiten und dritten? Z.B. Ein Dokument mit {first: 10, second: 10, third: 10} hat möglicherweise die höchste Individualität, aber {first: 200, second: 0, dritt: 0} hat eine höhere Summe über die Felder. –

+0

@BuzzMoschetti Höchste Summe der ersten, zweiten und dritten ist, was ich suche –

Antwort

0

Dies sollte den Trick. Sie benötigen auch die $add Funktion dort.

db.foo.aggregate([ 
    {$group: {_id: "$ipaddress", 
      max: { $max: {$add: [ "$first.count", "$second.count", "$third.count"] } } 
      } 
    } 
]); 
+0

Ah, ja! Ich danke dir sehr.. :) –

0

das ist, weil in der $group Pipeline können Sie nicht Dinge wie die

ipaddress: "$ipaddress" 

Das Feld IP-Adresse hat durch einen Akkumulator Betreiber begleitet werden. Die Dokumentation ist hier ausgezeichnet here

einen Blick Wenn Sie zu einer Gruppe von IP address bedeuten, dann haben Sie es so schreiben: entweder

_id: "$ipaddress" 

Ihr $max Operator wird nicht funktionieren auf diese Weise. Dies ist die Art, wie Sie es in der $project Pipeline nicht in der $group verwenden. Bitte werfen Sie einen Blick here

So Ihre Aggregation würde wie dieses aussehen:

db.collection.aggregate([ 
{ 
    $group: 
    { 
     _id: "$ipaddress", 
     max: { 
      $max: {first: "$first.count", second: "$second.count", third: "$third.count"} 
     } 
    } 
} 
]) 
Verwandte Themen