Монго. Запросите документы с массивом, чьи дочерние элементы ВСЕ должны соответствовать запросу - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь написать запрос с использованием механизма агрегирования Монго. Чего я хочу добиться - это выбрать заказы , если ВСЕ посылки были доставлены более месяца назад .

В настоящее время я могу выбрать заказы, по крайней мере, одна посылка была доставлена ​​более месяца назад.

Вот что у меня есть:

db['shop.orders'].aggregate(
{
  $match: { 
    shipments: { $elemMatch: { status: "Delivered", deliveredAt: {"$lte":new Date("2018-07-28")}} }
     }
})

Как мне изменить свой запрос, чтобы выбрать только те заказы, в которых ВСЕ отправления были доставлены более месяца назад?

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете использовать $ map , чтобы применить ваше условие для каждого shipment, а затем использовать $ allElementsTrue внутри $ expr , чтобы проверить, совпадают ли все эти элементы :

db.shop_orders.aggregate([
    {
        $match: { shipments: { $exists: true, $ne: [] } }
    },
    {
        $match: {
            $expr: {
                $allElementsTrue: {
                    $map: {
                        input: "$shipments",
                        as: "shipment",
                        in: {
                            $and: [
                                { $eq: [ "$$shipment.status", "Delivered" ] },
                                { $lte: [ "$$shipment.deliveredAt", new Date("2018-07-28") ] }
                            ]
                        }
                    }
                } 
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...