首页 > 解决方案 > 如果属性与第二个集合的任何属性匹配,则 MongoDB leftjoin

问题描述

我是 MongoDB 的新手,正在努力解决以下问题。

我有 2 个集合,结构如下:

标签集合:

{
    "_id": "10",
    "assets": [
        {
            "_id": "11",
            "path": "aa.png"
        },
        {
            "_id": "22",
            "path": "gg.png",
        }
    ]
},
{
    "_id": "22",
    "assets": [
        {
            "_id": "33",
            "path": "jj.png"
        },
        {
            "_id": "44",
            "path": "kk.png",
        }
    ]
}

广告集合:

{
    "_id": "64",
    "value": "zuzu",
    "default_values": {
        "background_image_1": "aa.png",
        "brand_image": "bb.png",
        "background_image_2": "cc.png",
        "background_image_3": "dd.png",
        "random_image_1": "ee.png"
    }
},
    {
    "_id": "75",
    "value": "gogo",
    "default_values": {
        "background_image_1": "aa.png",
        "background_image_2": "gg.png",
        "background_image_3": "hh.png",
        "background_image_4": "ii.png",
        "background_image_5": "jj.png"
    }
}

如果“路径”与 中的任何属性有任何匹配"default_values",我需要将 添加"value"到对象中,如下所示。

预期结果:

{
    "_id": "10",
    "assets": [
        {
            "_id": "11",
            "path": "aa.png",
            "value": ["zuzu", "gogo"]
        },
        {
            "_id": "22",
            "path": "gg.png",
            "value": ["gogo"]
        }
    ]
},
{
    "_id": "22",
    "assets": [
        {
            "_id": "33",
            "path": "jj.png",
            "value": ["gogo"]
        },
        {
            "_id": "44",
            "path": "kk.png",
            "value": []
        }
    ]
}

最后一件事,我到达Tags了聚合之后。

任何帮助将不胜感激!

标签: mongodbaggregation-framework

解决方案


每个都asset需要单独处理,因此您必须从$unwind开始。在下一步中,您可以使用自定义连接条件运行 $lookup,它将数据与Adverts. 内部管道有点复杂,因为您需要先运行$objectToArray才能$filter该数组并找到匹配的图像。在查找阶段之后,您需要$group来组合您Tags的基于_id值。

db.Tags.aggregate([
    {
        $unwind: "$assets"
    },
    {
        $lookup: {
            from: "Adverts",
            let: { path: "$assets.path" },
            pipeline: [
                { 
                    $project: {
                        value: 1, 
                        img: {
                            $filter: {
                                input: { "$objectToArray": "$default_values" },
                                cond: { $eq: [ "$$this.v", "$$path" ] }
                            }
                        } 
                    } 
                },
                { $match: { $expr: { $gt: [ { $size: "$img" }, 0 ] } } },
                { $project: { _id: 0, value: 1 } }
            ],
            as: "value"
        }
    },
    {
        $group: {
            _id: "$_id",
            assets: {
                $push: {
                    _id: "$assets._id",
                    path: "$assets.path",
                    value: { $map: { input: "$value", in: "$$this.value" } }
                }
            }
        }
    }
])

蒙戈游乐场


推荐阅读