2012-08-29 30 views
11

Tôi đang cố gắng tìm hiểu MongoDB và cách nó hữu ích cho việc phân tích cho tôi. Tôi chỉ đơn giản là chơi đùa với các bảng điều khiển JavaScript có sẵn trên trang web của họ và đã tạo ra các mục sau đây:Lấy một tập hợp riêng biệt của một trường mảng trên các chỉ mục

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

Những gì tôi muốn làm là truy vấn vì vậy tôi có được một danh sách các thẻ duy nhất cho tất cả các đối tượng . Kết quả sẽ trông giống như sau:

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

Tôi làm cách nào để truy vấn điều này? Tôi đang cố gắng để distinct() nó, nhưng cuộc gọi luôn thất bại mà không cần truy vấn.

Trả lời

24

Các mã mà không thành công trên trang web của họ hoạt động trên một thể hiện MongoDB thực tế:

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

Weird.

+1

thông báo lỗi gì bạn nhận được? Tôi tin rằng giao diện điều khiển đang chạy trên một phiên bản rất cũ ... – Sammaye

+0

Mã này hoạt động hoàn hảo với Mongo 3.6.0 – kopos

3

Có vài web Mongo console có sẵn:

Nhưng nếu bạn gõ giúp đỡ trong đó bạn sẽ nhận ra họ chỉ hỗ trợ một số lượng rất nhỏ của 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 

Như vậy không khác biệt làm việc vì nó không được hỗ trợ.

+0

@wkhatch nếu bạn đọc câu hỏi một lần nữa OP đã hỏi cách thực hiện tổng hợp trong bảng điều khiển web được sử dụng để cung cấp trên trang MongoDB. Tôi trả lời đúng là bạn không thể – Sammaye

5

Bạn có thể sử dụng khung tổng hợp. Tùy thuộc vào cách bạn muốn kết quả có cấu trúc, bạn có thể sử dụng một trong hai

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 
} 

hoặc

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

Bạn sẽ có thể sử dụng này:

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

Một cách khác để nhận độc đáo các phần tử mảng sử dụng đường ống tổng hợp

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

bộ sưu tập

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

đường ống

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

kết quả

{ "uniqueTags" : [ "abc", "def", "efg", "ijk", "lmo", "zyx" ] } 
Các vấn đề liên quan