我有一个包含嵌套数组数据的文档。我绝望地尝试使用$elemMatch
过滤数据,但我无法弄清楚它为什么不起作用。
{
'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 :(得分:17)
您的查询只是返回包含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
)。