Как сделать цепную агрегацию коллекций mongoDB с несколькими сравнениями локальных полей? - PullRequest
1 голос
/ 08 июля 2019

Вот мои коллекции:

Пользователи:

{
    user: xxx,
    job: xxx,
    order: xxxx
}

автомобили:

{
    order: xxxx,
    cost: yyyy
}

самолет:

{
    order: xxxx,
    cost: yyyy
}

страхование:

{
    cost: yyyy,
    terms: zzzz
}

Во-первых, я хочу объединить «пользователей» с «автомобилями» или «самолетами» на основе соответствия значения поля «заказ». После этого я объединяю результат со сбором «страхование» на основе поля «стоимость».

Итак, я хочу, чтобы результат был таким:

{ "user" : xx, ..., "order": dsad, "cars": {}, "plane": {"order": ddsa, "cost": awew} , "terms": sdada},
{ "user" : yy, ..., "order": sawe, "cars": {"order": fda, "cost": qwez}, "plane": {} , "terms": tyrw},
{ "user" : zz, ..., "order": qwez, "cars": {}, "plane": {} , "terms":{} }

Я попытался использовать db.users.aggregate () вместе с $ lookup, как показано ниже:

db.check.aggregate([
{
    $lookup:
        {
            from: "cars",
            localField: "order",
            foreignField: "order",
            as: "cars"
        }    
},
{
    $unwind: {path: "$cars", preserveNullAndEmptyArrays: true}
},    
{
    $lookup:
        {
            from: "planes",
            localField: "order",
            foreignField: "order",
            as: "planes"
        }    
},
{
    $unwind: {path: "$planes", preserveNullAndEmptyArrays: true}
},  

и это приводит к:

{ "user" : xx, ..., "order": dsad, "cars": {}, "plane": {"order": ddsa, "cost": awew}},
{ "user" : yy, ..., "order": sawe, "cars": {"order": fda, "cost": qwez}, "plane": {}},
{ "user" : zz, ..., "order": qwez, "cars": {}, "plane": {}}

но я не знаю идти дальше оттуда!

1 Ответ

0 голосов
/ 08 июля 2019

Вы можете использовать $ lookup с конвейером , чтобы получить то, что вы хотите.

Попробуйте это:

db.check.aggregate([
{
    $lookup:
        {
            from: "cars",
            localField: "order",
            foreignField: "order",
            as: "cars"
        }    
},
{
    $unwind: {path: "$cars", preserveNullAndEmptyArrays: true}
},    
{
    $lookup:
        {
            from: "planes",
            localField: "order",
            foreignField: "order",
            as: "planes"
        }    
},
{
    $unwind: {path: "$planes", preserveNullAndEmptyArrays: true}
},{
    $lookup:{
        from : "insurance",
        let  : {
            carCost : "$cars.cost",
            planeCost : "$planes.cost"
        },
        pipeline : [{
            $match : {
                $expr :{
                    $or : [{
                        cost : "$$carCost" 
                    },{
                        cost : "$$planeCost"
                    }
                    ]
                }
            }
        }],
        as : "insurance"
    }
},{
    $unwind: {path: "$insurance", preserveNullAndEmptyArrays: true}
},{
    $project : {
        user:1,
        order:1,
        cars:1,
        planes:1,
        terms : "$insurance.terms"
    }
}]
...