Агрегировать на двухуровневом массиве вложенных идентификаторов - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужна ваша помощь для запроса агрегации.Я провел несколько поисков перед публикацией, но ни один из найденных результатов не помог мне.

У меня есть эти документы:

заказ:

{
    "_id" : MongoId,
    "customId" : integer,
    ... other fields
    "circuit" : MongoId, // Ref to Circuit Document
    "agency" : MongoId, // Ref to Agency document
    "customer" : MongoId, // Ref to Customer document
    "places" : [ // Array of MongoId ref to place document
        MongoId, 
        MongoId,
        ...
    ],
    "materials" : [ // Array of MongoId ref to material document
        MongoId, 
        MongoId,
        ...
    ],
    ... other fields
}

схема:

{
    "_id" : MongoId,
    "customId" : Integer,
    "name" : String,
    "state" : String,
    "type" : String,
    "agency" : MongoId,
    "trucks" : [ // Array of MongoId ref to truck document
        MongoId, 
        MongoId,
        ...
    ],
    "drivers" : [ // Array of MongoId ref to truck document
        MongoId, 
        MongoId,
        ...
    ],
    "orders" : [ // Array of MongoId ref to order document
        MongoId, 
        MongoId,
        ...
    ]
}

Поэтому мне нужно получать водителей, грузовики, заказы на каждую трассу.С этой частью все в порядке, запрос работает (см. Ниже).

Но я не смог достать все места и материалы из каждого заказа из каждой схемы.

Итак, вот мой текущий запрос:

db.circuit.aggregate([
    {$match: {"date": {$lte: ISODate("2019-04-01 23:59:59")}}},
    {$match: {"date": {$gte: ISODate("2019-03-31 00:00:59")}}},
    {
        $lookup: {
            from: "agency",
            localField: "agency",
            foreignField: "_id",
            as: "agency"
        }
    },
    {$unwind: "$agency"},
    {
        $lookup: {
            from: "order",
            localField: "orders",
            foreignField: "_id",
            as: "orders"
        }
    },
    {
        $lookup: {
            from: "driver",
            localField: "drivers",
            foreignField: "_id",
            as: "drivers"
        }
    },
    {
        $group: 
        {
            "_id": "$_id",
            "agency": {$addToSet: "$agency.name"},
            "date": {$addToSet: "$date"},
            "orders": {$addToSet: "$orders"},
            "drivers": {$addToSet: "$drivers"},
        }
    },
    {$unwind: "$agency"},
    {$unwind: "$date"},
    {$unwind: "$orders"},
    {$unwind: "$drivers"},
    {
        $project: {
            "agency": "$agency",
            "date": "$date",
            "closedOrders": {
                $map: {
                    input: {
                        $filter: {
                            input: "$orders",
                            as: "o",
                            cond: {
                                $in: [
                                    "$$o.state", ["closed"]
                                ]
                            }
                        }
                    },
                    as: "order",
                    in: {
                        "id": "$$order.customId"
                    }
                }
            },
            "startedOrders": {
                $map: {
                    input: {
                        $filter: {
                            input: "$orders",
                            as: "o",
                            cond: {
                                $in: [
                                    "$$o.state", ["started"]
                                ]
                            }
                        }
                    },
                    as: "order",
                    in: {
                        "id": "$$order.customId"
                    }
                }
            },
            "plannedOrders": {
                $map: {
                    input: {
                        $filter: {
                            input: "$orders",
                            as: "o",
                            cond: {
                                $in: [
                                    "$$o.state", ["started", "added"]
                                ]
                            }
                        }
                    },
                    as: "order",
                    in: {
                        "id": "$$order.customId"
                    }
                }
            },
            "orders": {
                $map: {
                    input: "$orders",
                    as: "o",
                    in: {
                        ... Orders fields
                    }
                }
            },
            "drivers": {
                $map: {
                    input: "$drivers",
                    as: "driver",
                    in: {
                        ... Drivers fields
                    }
                }
            }
        }
    }

]);

Я попробовал несколько способов получить места и материалы по заказам из схемы (двухуровневый документ).

Чтобы проиллюстрировать мою потребность, выходные данные должны выглядеть следующим образом:

{
    "_id" : "5c6e6f7be05bd900a1682582",
    "customId" : 4966075,
    "name" : "Circuit name",
    "date" : ISODate("2019-04-01T23:00:00.000Z"),
    "type" : "TYPE",
    "agency" : {
        "_id" : "5c6cfe7ae05bd9007477f7ee",
        "customId" : 0,
        "name" : "AGENCY NAME"
    },
    "trucks" : [ 
        {
            "_id" : "5c6e6f7be05bd900a1682583",
            "code" : "CODE",
        },
        {
            "_id" : "5c6cfe7ee05bd9007478018f",
            "code" : "CODE NEXT",
        }
    ],
    "drivers" : [ 
        {
            "_id" : "5c7e6f7be05bd900a168264a",
            "code" : "CODE D",
        },
        {
            "_id" : "5c89fe7ee05bd90074782549",
            "code" : "CODE D NEXT",
        }
    ],
    "orders" : [ 
        {
            "_id" : "5c6e7125e05bd900a1683596",
            "customId" : 122116867,
            "bonPassage" : "ELEC",
            "date" : ISODate("2019-04-01T23:00:15.000Z"),
            "state" : "closed",
            "type" : "TYPE",
            "circuit" : "5c6e6f7be05bd900a1682582",
            "agency" : {
                "_id" : "5c6cfe7ae05bd9007477f7ee",
                "customId" : 0,
                "name" : "AGENCY NAME"
            },
            "customer" : {
                "_id" : "5c6cfed9e05bd90074787634",
                "customId" : 0,
                "nom" : "CUSTOMER NAME",
            },
            "places" : [ 
                {
                    "_id" : "5c6d0181e05bd900747a3a71",
                    "customId" : 0,
                    "name" : "Unknown",
                    "agencies" : []
                },
                ...
            ],
            "materials" : [ 
                {
                    "_id" : "5c6d024be05bd900747a542e",
                    "customId" : 0,
                    "code" : "Unknown",
                    "agencies" : []
                },
                ...
            ],
        },
        ...
    ]
}

Не могли бы вы помочь мне реализовать этот последний кусок для моего запроса и, если возможно, с хорошими показателями:)

Спасибо!

...