Mongodb 子单据多字段Mongo查询
假设我有一个这样的收藏:Mongodb 子单据多字段Mongo查询,mongodb,mongodb-query,Mongodb,Mongodb Query,假设我有一个这样的收藏: { "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 } ] } db.collection.f
{ "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 } ] }
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
我想找到所有arr
包含一个子文档的文档,该子文档的名称
=“b”和num
=2
如果我执行这样的查询:
{ "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 } ] }
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
它将返回集合中的所有文档,因为每个文档都包含一个子文档,该子文档的名称
为“b”,或者num
为2
我也试过:
db.collection.find({
arr: [
{ "name": "b", "num": 2 }
]
});
它不会抛出任何错误,但不会返回任何结果
如何在MongoDB中查询多个子文档字段?这实际上是运算符的作用,尽管它经常被误用。它本质上对数组中的每个元素执行查询条件。除非另有明确调用,否则所有MongoDB参数都是“and”操作:
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({
美元及:[
{“arr.name”:“b”},
{“arr.num”:2}
]
});
因为有多个数组元素满足这些条件,这不仅仅是因为这两个条件都适用于同一个元素。这就是
$elemMatch
所添加的内容,当您需要匹配多个条件时,这就是您使用它的地方。非常有用且完整的答案,很抱歉无法进行两次投票。谢谢你,尼尔!