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 个heightage 都 >= 10 的人的每个文档。 我当前的查询类似于 $and: [people.height: $gte, 10, people.age: $gte: 10]

但是,这会同时返回 ID 1 和 2,而只有 id 1 包含一个人,且两者都 >=10。

2。与上面相同的问题,但该列表嵌套在第二个列表中。如果至少有一个人同时 >= 10 ageheight,则只应返回 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 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb在隐式AND中发现方法混淆

Mongodb在隐式AND中发现方法混淆

What is MongoDB and For What?

MongoDB 使用 $and 和切片和匹配

MongoDB高级操作

mongodb AND查询遇到多个index时候可能会做交集——和复合索引不同