2012-08-29 4 views
11

Ich versuche, MongoDB zu lernen und wie es für Analysen für mich nützlich wäre. Ich bin einfach mit der JavaScript-Konsole auf ihrer Website herumgespielt und habe folgende Artikel erstellt:Erhalten einer eindeutigen Aggregation eines Array-Felds über Indizes

{"title": "Cool", "_id": {"$oid": "503e4dc0cc93742e0d0ccad3"}, "tags": ["twenty", "sixty"]} 
{"title": "Other", "_id": {"$oid": "503e4e5bcc93742e0d0ccad4"}, "tags": ["ten", "thirty"]} 
{"title": "Ouch", "_id": {"$oid": "503e4e72cc93742e0d0ccad5"}, "tags": ["twenty", "seventy"]} 
{"title": "Final", "_id": {"$oid": "503e4e72cc93742e0d0ccad6"}, "tags": ["sixty", "seventy"]} 

Was Ich mag würde, ist Abfrage zu tun, so erhalte ich eine Liste der einzigartigen Tags für all diese Objekte . Das Ergebnis sollte in etwa so aussehen:

["ten", "twenty", "thirty", "sixty", "seventy"] 

Wie frage ich danach? Ich versuche es zu distinct() es, aber der Anruf schlägt immer fehl, ohne sogar abzufragen.

Antwort

24

Der Code, der auf ihrer Website nicht funktioniert auf einer tatsächlichen MongoDB Beispiel:

> db.posts.insert({title: "Hello", tags: ["one", "five"]}); 
> db.posts.insert({title: "World", tags: ["one", "three"]}); 
> db.posts.distinct("tags"); 
[ "one", "three", "five"] 

Schräge.

+1

Welche Fehlermeldung erhalten Sie? Ich glaube, dass die Konsole auf einer sehr alten Mongo-Version läuft ... – Sammaye

+0

Dieser Code funktioniert perfekt mit Mongo 3.6.0 – kopos

3

Es gibt einige Web-Mongo Konsolen:

Aber, wenn Sie Hilfe in sie eingeben werden Sie feststellen, sie nur eine sehr geringe Anzahl von ops unterstützt:

HELP 
Note: Only a subset of MongoDB's features are provided here. 
For everything else, download and install at mongodb.org. 

db.foo.help()     help on collection method 
db.foo.find()     list objects in collection foo 
db.foo.save({a: 1})   save a document to collection foo 
db.foo.update({a: 1}, {a: 2}) update document where a == 1 
db.foo.find({a: 1})   list objects in foo where a == 1 

it       use to further iterate over a cursor 

Als solche unterscheidet sich nicht arbeiten, weil es nicht unterstützt wird.

+0

@wkhatch, wenn Sie die Frage erneut lesen, fragte das OP, wie Aggregation in der Webkonsole, die verwendet wird, zu tun auf der MongoDB-Website. Ich habe richtig geantwortet, dass du nicht kannst – Sammaye

5

Sie können das Aggregationsframework verwenden. Je nachdem, wie Sie die Ergebnisse strukturiert möchten, können Sie entweder

var pipeline = [ 
     {"$unwind": "$tags" } , 
     { "$group": { _id: "$tags" } } 
    ]; 
R = db.tb.aggregate(pipeline); 
printjson(R); 

{ 
     "result" : [ 
       { 
         "_id" : "seventy" 
       }, 
       { 
         "_id" : "ten" 
       }, 
       { 
         "_id" : "sixty" 
       }, 
       { 
         "_id" : "thirty" 
       }, 
       { 
         "_id" : "twenty" 
       } 
     ], 
     "ok" : 1 
} 

oder

var pipeline = [ 
     {"$unwind": "$tags" } , 
     { "$group": 
      { _id: null, tags: {"$addToSet": "$tags" } } 
     } 
    ]; 
R = db.tb.aggregate(pipeline); 
printjson(R); 

{ 
     "result" : [ 
       { 
         "_id" : null, 
         "tags" : [ 
           "seventy", 
           "ten", 
           "sixty", 
           "thirty", 
           "twenty" 
         ] 
       } 
     ], 
     "ok" : 1 
} 
7

sollten Sie in der Lage sein, dies zu verwenden:

db.mycollection.distinct("tags").sort() 
1

Eine weitere Möglichkeit der einzigartigen bekommen Array-Elemente mit Aggregation Pipeline

Sammlung

> db.blogs.find() 
{ "_id" : ObjectId("5a6d53faca11d88f428a2999"), "name" : "sdfdef", "tags" : [ "abc", "def", "efg", "abc" ] } 
{ "_id" : ObjectId("5a6d5434ca11d88f428a299a"), "name" : "abcdef", "tags" : [ "abc", "ijk", "lmo", "zyx" ] } 
> 

Pipeline

> db.blogs.aggregate(
...  [ 
...  {$group:{_id : null, uniqueTags : {$push : "$tags"}}}, 
...  {$project:{ 
...   _id : 0, 
...   uniqueTags : { 
...   $reduce : { 
...    input : "$uniqueTags", 
...    initialValue :[], 
...    in : {$let : { 
...    vars : {elem : { $concatArrays : ["$$this", "$$value"] }}, 
...    in : {$setUnion : "$$elem"} 
...    }} 
...   } 
...   } 
...  }} 
...  ] 
... ) 

Ergebnis

{ "uniqueTags" : [ "abc", "def", "efg", "ijk", "lmo", "zyx" ] } 
Verwandte Themen