基于范围查询MongoDB中嵌入式文档的数组

时间:2019-05-14 19:10:37

标签: mongodb mongodb-query aggregation-framework

如何在mongodb中查询嵌入式文档的数组。

{
 _id: 1,
 zipcode: "63109",
 students: [
              { name: "john", school: 102, age: 14 },
              { name: "jess", school: 102, age: 11 },
              { name: "jeff", school: 108, age: 15 }
           ]
}
{
 _id: 2,
 zipcode: "63110",
 students: [
              { name: "ajax", school: 100, age: 7 },
              { name: "achilles", school: 100, age: 8 },
           ]
}
{
 _id: 3,
 zipcode: "63109"
}

对于上述数据,我们将如何仅检索age> = 7和age <= 10的那些行。对于id_1,仅应返回年龄为10的行。 id_2和id_3中的两行。另外,id_4没有称为学生的字段。因此,我不希望在输出中看到它。

编辑:- 进行过滤时,我得到的输出看起来像这样。但我不希望具有“无”的行。 最后一个文档_id:3没有现场学生,但是对学生进行了过滤,因此输出具有与之对应的“无”。

我希望处理2个案例:

  1. 在ID下不存在数组“学生”的情况下,不应应用任何过滤器。
  2. 数组学生存在,但为空[]

这两种情况都经过简单过滤后最终会出现在输出中。


{'_id': ObjectId('5cdaefd393436906b016ddb4'),
 'students': [{'name': ajax,
               'school': '100',
               'age': '7'},
              {'name': achilles,
               'school': '100',
               'age': '8'}],
{'_id': ObjectId('5cdaefd393436906b016ddb3'), 'students': None}

注意:我使用的是不同但相同的数据集,因此输出不准确,但希望您能理解。 “学生”是嵌入式文档,可能会或可能不会出现在所有文档中。

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.collection.aggregate([
  { "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$students", []] } }, 1] }}},
  { "$addFields": {
    "students": {
      "$filter": {
        "input": { "$ifNull": ["$students", []] },
        "cond": {
          "$and": [
            { "$gte": ["$$this.age", 7] },
            { "$lte": ["$$this.age", 10] }
          ]
        }
      }
    }
  }}
])