MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]
Posted
技术标签:
【中文标题】MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]【英文标题】:MongoDB $and Query only if the $and is true within the same array index of a document - especially for a doubly nested array [duplicate] 【发布时间】:2020-03-04 10:43:30 【问题描述】:1.仅当 $and 出现在同一数组元素中时才查找它
假设我们在 mongoDB 中有这两个文档:
_id: 1, people: [height: 10, age: 10, height: 5, age: 5]
_id: 2, people: [height: 10, age: 5, height: 5, age: 10]
并且我们希望匹配至少有 1 个height
和 age
都 >= 10 的人的每个文档。
我当前的查询类似于
$and: [people.height: $gte, 10, people.age: $gte: 10]
但是,这会同时返回 ID 1 和 2,而只有 id 1 包含一个人,且两者都 >=10。
2。与上面相同的问题,但该列表嵌套在第二个列表中。如果至少有一个人同时 >= 10 age
和 height
,则只应返回 ID。
假设我们在 mongoDB 中有这两个文档:
_id: 1, families: [people: [height: 10, age: 10, height: 5, age: 5], people: [height: 0, age: 0, height: 0, age: 0]]
_id: 2, families: [people: [height: 10, age: 5, height: 0, age: 0], people: [height: 5, age: 10, height: 0, age: 0]]
如何构造一个只匹配 id 1 的查询?
3.为此类查询构建正确的索引
目前我有一个相当于families.people.height, families.people.age
的复合索引,但我相信这不会针对我应该使用的查询进行优化。索引应该改为families.people
吗?
注意:假设这个查询是在一个 mongoDB 上运行的,有大约 700,000,000 个文档
【问题讨论】:
案例2中的文档不是有效文档。对于第一种情况$elemMatch: height: $gte: 10, age: $gte: 10
$elemMatch
's doc中有一个example
【参考方案1】:
所以,您没有明确数据输出格式的要求。假设从聚合返回的数据架构不需要与集合中的文档相同,您可以使用 $unwind。
示例:
db.coll.aggregate([
$unwind: "$people" ,
$addFields:
isHeightMatch: $gte: [ "$people.height", 10 ] ,
isAgeMatch: $gte: [ "$people.age", 10 ]
,
$match:
$and: [
isHeightMatch: true ,
isAgeMatch: true
]
,
$project:
"isHeightMatch": 0,
"isAgeMatch": 0
])
输出:
"_id" : 1, "people" : "height" : 10, "age" : 10
【讨论】:
【参考方案2】:您可以使用MongoDB $elemMatch
来实现更具体的数组元素匹配。
为了得到至少 1 个身高和年龄都 >= 10 的人,您可以使用以下查询:
people: $elemMatch: $and: [ height: $gte: 10 , age: $gte: 10 ]
同样的事情也适用于嵌套数组。如果人员数组嵌套在家庭数组中,您可以使用以下查询:
'families.people': $elemMatch: $and: [ height: $gte: 10 , age: $gte: 10 ]
希望对你有帮助。
【讨论】:
以上是关于MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章