2013-12-11 97 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