首页 > 解决方案 > 如何通过多个本地字段比较对 mongoDB 集合进行链式聚合?

问题描述

这是我的收藏:

用户:

{
    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": {}}

但是,我不知道从那里走得更远!

标签: mongodbnosqlaggregate

解决方案


您可以将$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"
    }
}]

推荐阅读