这实际上就是$elemMatch http://docs.mongodb.org/manual/reference/operator/query/elemMatch/运算符是 for,尽管它经常被误用。它本质上是对数组“内”的每个元素执行查询条件。除非明确调用,否则所有 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
添加,当您需要多个条件来匹配时,这就是您使用它的地方。