【问题标题】:Querying Array of Embedded Documents in MongoDB based on Range基于 Range 查询 MongoDB 中嵌入文档的数组
【发布时间】:2019-05-14 19:10:36
【问题描述】:

如何在 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"
}

假设对于上述数据,如何仅检索年龄>=7 和年龄

编辑:- 当我做过滤器时,我得到的输出看起来像这样。但我不想要有“无”的行。 最后一个文档 _id: 3 没有字段学生,但对学生进行了过滤,因此输出具有对应的“无”。

我想处理两种情况:

  1. 如果 id 下不存在数组“students”,则不应应用过滤。
  2. 数组学生存在但为空 []

如果只是过滤,这两种情况都会在输出中结束。


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

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

编辑:最后我使用 unwind 来实现我想要的。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案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] }
              ]
            }
          }
        }
      }}
    ])
    

    【讨论】:

    • 您好,我收到一条错误消息,提示“$size 的参数必须是一个数组,但缺少类型”。嗨,我将您解决方案中的第一行替换为以下内容: {match: { "students": { $exists: True } } } 并解决了这个问题。非常感谢您的帮助。
    • 嗯别忘了Accept an Answer
    猜你喜欢
    • 2021-08-07
    • 2015-08-30
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多