2013-03-15 59 views
1

我有如下文件:如何檢索MongoDB中數組中存在的所有匹配元素?

{ 
    name: "testing", 
    place:"London", 
    documents: [ 
         { 
          x:1, 
          y:2, 
         }, 
         { 
          x:1, 
          y:3, 
         }, 
         { 
          x:4, 
          y:3, 
         } 
      ] 
    } 

我想檢索所有匹配的文件,即我想O/P在以下格式:

{ 
    name: "testing", 
    place:"London", 
    documents: [ 
         { 
          x:1, 
          y:2, 
         }, 
         { 
          x:1, 
          y:3, 
         } 

      ] 
    } 

我曾嘗試是:

db.test.find({"documents.x": 1},{_id: 0, documents: {$elemMatch: {x: 1}}}); 

但是,它只提供第一個條目。

+0

的可能重複的[MongoDB的:選擇匹配子集合的元件](http://stackoverflow.com/questions/15415023/mongodb-選擇匹配的元素 - 的-子集合) – JohnnyHK 2013-03-15 13:08:10

回答

3

正如JohnnyHK說,MongoDB: select matched elements of subcollection答案解釋得很好。

在你的情況,總應該是這樣的:

(注:第一場比賽是不是絕對必要的,但它在性能方面幫助(可使用指數)和內存使用($放鬆對有限集)

> db.xx.aggregate([ 
...  // find the relevant documents in the collection 
...  // uses index, if defined on documents.x 
...  { $match: { documents: { $elemMatch: { "x": 1 } } } }, 
...  // flatten array documennts 
...  { $unwind : "$documents" }, 
...  // match for elements, "documents" is no longer an array 
...  { $match: { "documents.x" : 1 } }, 
...  // re-create documents array 
...  { $group : { _id : "$_id", documents : { $addToSet : "$documents" } }} 
... ]); 
{ 
    "result" : [ 
     { 
      "_id" : ObjectId("515e2e6657a0887a97cc8d1a"), 
      "documents" : [ 
       { 
        "x" : 1, 
        "y" : 3 
       }, 
       { 
        "x" : 1, 
        "y" : 2 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 

有關集合()的詳細信息,請參閱http://docs.mongodb.org/manual/applications/aggregation/

相關問題