Фильтровать массив по значению во вложенном массиве mongodb - PullRequest
1 голос
/ 29 сентября 2019

У меня есть следующая модель:

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

Я бы хотел отфильтровать массив «уроки» на основе значения во вложенном массиве «субъект».Фильтр, я имею в виду удалить весь объект из массива «уроки», если, например, значение во вложенном массиве «субъект» не равно значению «Порядок».

Ожидаемый результат (удалить объект, поскольку вложенный массив содержит значение «Порядок»)):

{
    "_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 Ответ

1 голос
/ 29 сентября 2019

Что мы можем сделать здесь:

  • первое использование этап агрегирования $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
        }
    ]
}
...