2013-12-11 96 views
8

我有一個包含嵌套數組數據的文檔。我試圖絕望地使用$elemMatch過濾數據,但我無法弄清楚它爲什麼不起作用。用elemMatch查詢嵌套數組數據的MongoDB查詢

{ 
'id' : 1, 
'name' : 'test', 
'modules' : [ 
    { 
     name: 'foo', 
     mandatory: false, 
     group: [ 
      { 
       name: g1 
      }] 
    }, 
    { 
     name: 'bar', 
     mandatory: false, 
     group: [ 
      { 
       name: g2 
      }] 
    }] 
} 

我嘗試使用此查詢:

db.test.find(
{ 
    modules: { 
      $elemMatch: { 
       name: "foo", 
      } 
    } 
} 

但它一直返回所有模塊。如果我使用mandatory: true,它不會返回任何內容,這似乎表明它有效。任何想法我做錯了什麼?謝謝!

+0

查詢是非常簡單的,但更新呢? –

回答

16

您的查詢僅返回包含modules元素的所有文檔,其中name == 'foo'。要使用$elemMatch過濾輸出,你需要在find呼叫,而不是查詢的一部分的投影參數使用它:

db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}}) 

要結合這兩個概念,你可以參考數組的索引元素查詢與$匹配:

db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1}) 

無論哪種方式的回報:

{ 
    "_id": ObjectId("..."), 
    "modules": [ 
    { 
     "name": "foo", 
     "mandatory": false, 
     "group": [ 
     { 
      "name": "g1" 
     } 
     ] 
    } 
    ] 
} 

如果您需要輸出中包含的其他字段,請將它們添加到投影對象(例如, name: 1)。

+17

鏈接'elemMatch'可以嗎?例如,要過濾名稱上的「組」列表? – Phil