【问题标题】:Filter array based on value in nested array mongodb根据嵌套数组mongodb中的值过滤数组
【发布时间】:2019-09-29 13:24:41
【问题描述】:

我有以下型号:

{
    "_id" : ObjectId("...some id"),
    "lessons" : [
        {
            "date" : ISODate("2019-09-23T16:00:00.000+02:00"),
            "subject" : [
                "Javascript",
                "Order"
            ],
            "price" : 60
        },
        {
            "date" : ISODate("2019-09-24T16:00:00.000+02:00"),
            "subject" : [
                "Javascript"
            ],
            "price" : 120
        }
    ]
}

我想根据嵌套“主题”数组中的值过滤“课程”数组。 过滤器我的意思是如果嵌套数组“主题”中的值不等于值“顺序”,则从数组“课程”中删除整个对象。

预期输出(移除对象,因为嵌套数组包含“Order”值):

{
    "_id" : ObjectId("...some id"),
    "lessons" : [
        {
            "date" : ISODate("2019-09-24T16:00:00.000+02:00"),
            "subject" : [
                "Javascript"
            ],
            "price" : 120
        }
    ]
}

我尝试过使用 $filter 管道,但它会覆盖整个数组“课程”。



db.students.aggregate([
  {
    $project: {
        "lessons": {
            $filter: {
                input: "$lessons.subject",
                as: "subject",
                cond: {
                    $ne: [
                        "$$subject",
                        "Order"
                    ]

                }
            }
        }
    }  
  },
]);

【问题讨论】:

    标签: mongodb nosql mongodb-query aggregation-framework


    【解决方案1】:

    我们可以在这里做的是:

    • 第一次使用聚合阶段 $unwindlessons 字段上将它们视为单独的文档。
    • 然后在 subjects 字段(数组)上添加一个 $match 并附上条件。
    • 最后 $group 通过_id 并通过推lessons 返回 $push

    查询:

    db.collection.aggregate([
        { $unwind: "$lessons" },
        { $match: { "lessons.subject": { $ne: "Order" } } },
        {
          $group: {
            _id: "$_id",
            lessons: { $push: "$lessons" }
          }
        }
      ]).pretty();
    

    输出:

    {
        "_id" : ObjectId("5d6d0d401ce4f18674c11053"),
        "lessons" : [
            {
                "date" : ISODate("2019-09-24T14:00:00Z"),
                "subject" : [
                    "Javascript"
                ],
                "price" : 120
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2022-12-07
      • 2017-09-23
      • 1970-01-01
      • 2021-02-17
      相关资源
      最近更新 更多