2012-08-29 10 views
11

Próbuję nauczyć się MongoDB i sposobu, w jaki byłoby to przydatne dla mnie. Ja po prostu gry z konsoli JavaScript dostępny na ich stronie internetowej i stworzyliśmy następujące elementy:Uzyskiwanie wyraźnej agregacji pola tablicowego w indeksach

{"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"]} 

Co chciałbym zrobić, to zapytanie więc uzyskać listę unikalnych tagów dla wszystkich tych obiektów . Wynik powinien wyglądać mniej więcej tak:

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

Jak mogę o to zapytać? Próbuję to zrobić, ale wywołanie zawsze kończy się niepowodzeniem, nawet bez wysyłania zapytań.

Odpowiedz

24

Kod, który nie działa na swojej stronie internetowej na rzeczywisty przykład MongoDB:

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

dziwne.

+1

Jaki komunikat o błędzie nie można dostać? Wierzę, że konsola działa na bardzo starej wersji mongo ... – Sammaye

+0

Ten kod działa doskonale z Mongo 3.6.0 – kopos

3

Istnieje kilka konsol internetowej Mongo dostępny:

Ale jeśli wpiszesz pomoc w ich poznacie, że obsługuje tylko niewielką liczbę ops:

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 

Jako taki odrębny nie działa, ponieważ nie jest obsługiwany.

+0

@wchhatch jeśli ponownie przeczytałeś pytanie OP pytał, jak zrobić agregację w konsoli internetowej, która była używana na stronie MongoDB. Prawidłowo odpowiedziałem, że nie możesz – Sammaye

5

Możesz użyć struktury agregacji. W zależności od tego, jak chcesz wyniki skonstruowane, można użyć jednej

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 
} 

lub

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

Powinieneś być w stanie korzystać z tego:

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

Innym sposobem uzyskania wyjątkowy elementy tablicy za pomocą potoku agregacji

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"} 
      }} 
     } 
     } 
    }} 
    ] 
) 

kolekcja

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

rurociąg

> 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"} 
...    }} 
...   } 
...   } 
...  }} 
...  ] 
... ) 

wynik

{ "uniqueTags" : [ "abc", "def", "efg", "ijk", "lmo", "zyx" ] } 
Powiązane problemy