假设我有这样的集合:
{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] }
我希望找到arr
包含name
=" b"的子文档的所有文档。和num
= 2。
如果我这样做一个查询:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
它将返回集合中的所有文档,因为它们每个都包含一个子文档,其中name
为" b"或者是num
的2。
我也试过这个:
db.collection.find({
arr: [
{ "name": "b", "num": 2 }
]
});
不会丢失任何错误,但不会返回任何结果。
如何查询MongoDB中的多个子文档字段?
答案 0 :(得分:30)
这实际上是$elemMatch
运算符的用途,即使它经常被误用。它基本上对每个元素执行查询条件"在"数组。所有MongoDB参数都是"和"操作除非另有明确说明:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
你可能也想"项目"如果您只期望匹配的字段而不是 整个文件:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
最后解释为什么你的第二次尝试不起作用,这个查询:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
不匹配任何东西,因为没有实际文件在哪里" arr"包含与您的条件完全匹配的单一元素。
你的第一个例子失败了..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
因为有几个数组元素满足条件,这不仅仅考虑两个条件都适用于同一个元素。这就是 $elemMatch
添加的内容,当您需要更多的条件匹配时,这就是您使用它的地方。