根据嵌套数组mongodb中的值过滤数组

时间:2019-09-29 13:24:41

标签: mongodb nosql mongodb-query aggregation-framework

我有以下模型:

{
    "_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"
                    ]

                }
            }
        }
    }  
  },
]);

1 个答案:

答案 0 :(得分:1)

我们在这里可以做的是:

  • 首次使用聚合阶段 $unwind lessons字段上将其视为单个文档。
  • 然后在$match字段(数组)上具有条件的 subjects
  • 最后 $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
        }
    ]
}