2013-10-31 68 views
15

如果我運行

db.schools.find({ zipcode: 63109 }, 
      { students: { $elemMatch: { school: 102 } } }) 

我將使用here

{ 
_id: 1, 
zipcode: 63109, 
students: [ 
       { name: "john", school: 102, age: 10 }, 
       { name: "jess", school: 102, age: 11 }, 
       { name: "jeff", school: 108, age: 15 } 
      ] 
} 
{ 
_id: 2, 
zipcode: 63110, 
students: [ 
       { name: "ajax", school: 100, age: 7 }, 
       { name: "achilles", school: 100, age: 8 }, 
      ] 
} 

{ 
_id: 3, 
zipcode: 63109, 
students: [ 
       { name: "ajax", school: 100, age: 7 }, 
       { name: "achilles", school: 100, age: 8 }, 
      ] 
} 

{ 
_id: 4, 
zipcode: 63109, 
students: [ 
       { name: "barney", school: 102, age: 7 }, 
      ] 
} 

的例子中的所有對象將會給第一結果每個陣列。這個命名:

{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] } 
{ "_id" : 3 } 
{ "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] } 

我怎樣才能使它返回符合條件的陣列的所有對象(而不僅是第一個)?這意味着:

{ 
_id: 1, 
students: [ 
       { name: "john", school: 102, age: 10 }, 
       { name: "jess", school: 102, age: 11 } 
      ] 
}  
{ _id: 3 } 
{_id: 4, students: [ { name: "barney", school: 102, age: 7 }]} 
+0

看起來像文件表示,其$ elemMatch只返回第一個數組元素,所以我想你必須在python中完成它,或者使用'{「name」:「john」,「school」:102,「age」:10,zipcode:63109} ' – YOU

回答

16

爲了返回多個子文檔,您將需要使用聚合框架。這將返回所有你要找的子文檔:

db.zip.aggregate(
    {$match: {zipcode: 63109}}, 
    {$unwind: "$students"}, 
    {$match: {"students.school": 102}} 
) 

你可以做各種事情來獲得不同的輸出,但是這將返回:

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "zipcode" : 63109, 
      "students" : { 
       "name" : "john", 
       "school" : 102, 
       "age" : 10 
      } 
     }, 
     { 
      "_id" : 1, 
      "zipcode" : 63109, 
      "students" : { 
       "name" : "jess", 
       "school" : 102, 
       "age" : 11 
      } 
     }, 
     { 
      "_id" : 4, 
      "zipcode" : 63109, 
      "students" : { 
       "name" : "barney", 
       "school" : 102, 
       "age" : 7 
      } 
     } 
    ], 
    "ok" : 1 
} 
+0

它返回null。你能幫我嗎 –

+0

@UzumakiNaruto:你有沒有嘗試用你的集合名稱替換'.zip'?例如,'db.zip.aggregate'變成'db.yourcollection.aggregate' –