Mongo子文档多字段查询
Mongo Query On Multiple Fields Of Sub-Document
假设我有这样一个集合:
{ "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 }
]
});
它将 return 集合中的所有文档,因为它们每个都包含一个子文档,其 name
为 "b" 或 num
为 2。
我也试过这个:
db.collection.find({
arr: [
{ "name": "b", "num": 2 }
]
});
它不会抛出任何错误,但不会 return 任何结果。
如何在 MongoDB 中查询多个子文档字段?
这实际上就是 $elemMatch
运算符的用途,尽管它经常被误用。它本质上是对数组的每个元素"within"执行查询条件。所有 MongoDB 参数都是 "and" 操作,除非另外明确调用:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
如果您只需要匹配的字段而不是匹配的字段,您可能也想在这里 "project"
整个文档:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
最后解释为什么你的第二次尝试不起作用,这个查询:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
不匹配任何内容,因为没有实际文档 "arr" 包含与您的条件完全匹配的单个元素。
你的第一个例子失败了..:[=17=]
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
因为满足条件的数组元素有好几个,这不只是认为两个条件都适用于同一个元素。这就是 $elemMatch
添加的内容,当您需要多个条件来匹配时,这就是您使用它的地方。
假设我有这样一个集合:
{ "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 }
]
});
它将 return 集合中的所有文档,因为它们每个都包含一个子文档,其 name
为 "b" 或 num
为 2。
我也试过这个:
db.collection.find({
arr: [
{ "name": "b", "num": 2 }
]
});
它不会抛出任何错误,但不会 return 任何结果。
如何在 MongoDB 中查询多个子文档字段?
这实际上就是 $elemMatch
运算符的用途,尽管它经常被误用。它本质上是对数组的每个元素"within"执行查询条件。所有 MongoDB 参数都是 "and" 操作,除非另外明确调用:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
如果您只需要匹配的字段而不是匹配的字段,您可能也想在这里 "project" 整个文档:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
最后解释为什么你的第二次尝试不起作用,这个查询:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
不匹配任何内容,因为没有实际文档 "arr" 包含与您的条件完全匹配的单个元素。
你的第一个例子失败了..:[=17=]
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
因为满足条件的数组元素有好几个,这不只是认为两个条件都适用于同一个元素。这就是 $elemMatch
添加的内容,当您需要多个条件来匹配时,这就是您使用它的地方。