2014-11-20 36 views
3

如果我有以下的有效載荷:查詢檢索陣列中的多個項目

{ 
    "objs": [ 
     { "_id": "1234566", "some":"data", "key": "one" }, 
     { "_id": "1234576", "some":"data", "key": "one" }, 
     { "_id": "2345666", "some":"otherdata", "key": "two" }, 
     { "_id": "4566666", "some":"yetotherdata", "key": "three" }, 
    ] 
} 

我怎樣才能返回所有對象(OBJ文件)具有以下內容:

key: "one" 
_id: [1234566, 1234576] 

感謝

+1

我有我試圖解決同樣的問題。 @BatScream答案適用於我。 – luckytaxi 2015-02-26 17:49:15

回答

2

find()查詢返回的所有objs都具有與這兩個條件相匹配的子文檔。

var input = ["1234566","1234576"]; 
db.collection.find({$and:[{"objs._id":{$in:input}},{"objs.key":"one"}]}) 

如果你想獲得objs陣列內部的絕密文件,你可以使用聚合流水線作業實現這一目標。

  • 定義一個變量來保存輸入值。
  • $unwindobjs元素,這給你在objs數組中的每個 元素的單獨文檔。
  • $match只有那些符合選擇標準的文件。
  • $group"_id"的文件是自動生成mongo
  • $project必填字段。

驗證碼:

var input = ["1234566","1234576"]; 
db.collection.aggregate([ 
{$unwind:"$objs"}, 
{$match:{"objs._id":{$in:input},"objs.key":"one"}}, 
{$group:{"_id":"_id","objs":{$push:"$objs"}}}, 
{$project:{"_id":0,"objs":1}} 
]) 

O/P:

{ "objs" : 
     [ { "_id" : "1234566", "some" : "data", "key" : "one" }, 
      { "_id" : "1234576", "some" : "data", "key" : "one" } ] } 
+1

花了兩天找這個答案。非常感謝!!! – luckytaxi 2015-02-26 17:48:37

1

你不能。 MongoDB返回符合查詢條件的文檔,而不是與查詢條件匹配的單個文檔。您可以通過投影抑制或包含匹配文檔的字段,但不能(從2.6開始)返回一個受限制的數組,以包含匹配數組條件的元素。你可以用$

db.collection.find(
    { "objs" : { "$elemMatch" : { "_id" : { "$in" : [1234566, 1234576] }, "key" : "one" } } }, // query 
    { "_id" : 0, "objs.$" : 1 } // projection 
) 

如果你想返回所有匹配objs元素只返回第一個這樣的比賽,很有可能你應該讓objs陣列中的每個子文檔到集合在它自己的文件。