我有一个这样的 struct -

[
  {
    "name": "person1",
    "age": "16",
    "marks": 91
  },
  {
    "name": "person2",
    "age": "18",
    "qualification": [
      {
        "masters": [
          {
            "semester": {
              "number": "1",
              "subject": {
                "computer": 56,
                "english": 34,
                "hindi": 92
              }
            }
          },
          {
            "semester": {
              "number": "2",
              "subject": {
                "computer": 54,
                "english": 31
              }
            }
          }
        ]
      },
      {
        "bachelors": [
          {
            "semester": {
              "number": "1",
              "subject": {
                "computer": 54,
                "english": 81
              }
            }
          },
          {
            "semester": {
              "number": "2",
              "subject": {
                "computer": 67,
                "english": 42
              }
            }
          }
        ]
      }
    ]
  },
  {
    "name": "person3",
    "age": "19",
    "qualification": [
      {
        "masters": [
          {
            "semester": {
              "number": "1",
              "subject": {
                "computer": 94,
                "english": 100
              }
            }
          },
          {
            "semester": {
              "number": "2",
              "subject": {
                "computer": 45,
                "english": 21
              }
            }
          }
        ]
      },
      {
        "bachelors": [
          {
            "semester": {
              "number": "1",
              "subject": {
                "computer": 34,
                "english": 63
              }
            }
          },
          {
            "semester": {
              "number": "2",
              "subject": {
                "computer": 60,
                "english": 80
              }
            }
          }
        ]
      }
    ]
  }
]

我想投射所有谁曾经得分90分或更多的名字.但条件并不比仅仅卖到90英镑更复杂.对于年龄小于18岁的人,我们需要判断marks字段,对于年龄大于或等于18岁的人,我们需要查看所有computerenglish(非印地语)字段.因此,在我们的例子中,它应该报告Person 1和Person 3.此查询将在大约marksk条记录上运行,也应该是高性能的.我try 过$cond、$Match的各种组合.但还没能抓取一个适当的聚合查询-

db.collection.aggregate([
  {
    $match: {
      "marks": {
        $gte: 90,
        $lte: 100
      }
    }
  },
  {
    $project: {
      "name": 1
    }
  }
])

https://mongoplayground.net/p/l4zD05iKjyp

推荐答案

以下聚合管道实现了所需的输出:

db.collection.aggregate([
  { $match: {
      $or: [
        { 
          "age": { $lt: 18 },
          "marks": { $gte: 90 }
        },
        {
          "age": { $gte: 18 },
          $or: [
            { "qualification.masters.semester.subject.computer": {
                $gte: 90
            } },
            { "qualification.masters.semester.subject.english": {
                $gte: 90
            } },
            { "qualification.bachelors.semester.subject.computer": {
                $gte: 90
            } },
            { "qualification.bachelors.semester.subject.english": {
                $gte: 90
            } }
          ]
        }
      ]
    }
  },
  { $project: {
      "name": 1,
      "_id": 0
  } }
])

Mongo Playground

在上述管道中,初始$match阶段查找满足给定条件的文档:

  • 对于年龄在18岁以下的人,直接勾选marks字段.
  • 对于18岁或以上的人,判断mastersbachelorscomputerenglish科目的分数.

根据条件过滤单据后,下一阶段只投影name字段.

此聚合应该返回所需的结果,并且将在大小约为agek的集合上执行.但是,如果性能成为问题,请确保您在集合上创建了适当的索引,例如在agemarksqualification数组字段上创建的索引.

Mongodb相关问答推荐

如何在MongoDB中查找和过滤嵌套数组

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

Spring数据MongoDB(聚合)

mongo如何通过聚合加载嵌套文档

随着时间的推移在 mongodb 中获得

Meteor 和 Fibers/bindEnvironment() 是怎么回事?

MongoDB 使用自定义表达式或函数进行排序

Mongo 重启错误 -- /var/run/mongodb/mongod.pid 存在

什么是 Mongoose (Nodejs) 复数规则?

如何使用原子操作在一个文档中切换布尔字段?

Mongodb KeyFile 太开放权限

try 启用 Mongo DB 身份验证时发生 TypeError

如何匹配 MongoDB 聚合框架中的 undefined值?

如何在mongoose的嵌套填充中 Select 特定字段

如何从mongoose中的对象 ID 获取创建日期?

如何在 Ubuntu 10.04 中使用 --auth 选项重新启动 mongodb?

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?

用于 MongoDB 的 Node.js 模块

与 mongoose/node.js 共享数据库连接参数的最佳方式

MongoDB 引用的最佳实践