MongoDB 聚合:双重查找,并将查找响应合并到各个对象

2024-04-19

我正在尝试聚合,但找不到合适的管道来执行此操作。

所以,这是我的文档模型的一部分:

//company.js
{
    "_id" : "5dg8aa8c435b1e2868c841f6",
    "name" : "My Corp",
    "externalId" : "d7f348c9-c69b-69c4-923c-91458c53dc22",
    "professionals_customers" : [ 
        {
            "company" : "6f4d01eb3b948150c2aad9c0"
        }, 
        {
            "company" : "5dg7aa8c366b1e2868c841f6",
            "contact" : "5df8ab5c355b1e2999c841f7"
        }
    ],
}

我尝试返回充满数据的专业客户字段,就像经典的填充一样。

公司字段来自公司集合,联系人由用户集合提供

所需的输出必须如下所示:

{
"professionals_customers" : [ 
        {
            "company": {
                "_id": "6f4d01eb3b948150c2aad9c0",
                "name": "Transtar",
                "externalId": "d7f386c9-c79b-49c5-905c-90750c42dc22",
            },
        }, 
        {
            "company": {
                "_id": "5dg7aa8c366b1e2868c841f6",
                "name": "Aperture",
                "externalId": "d7f386c9-c69b-49c4-905c-90750c53dc22", 
            },
            "contact" : {
                "_id": "5df8ab5c355b1e2999c841f7",
                "firstname": "Caroline",
                "lastname": "Glados",
                "externalId": "d7f386c9-c69b-49c4-905c-90750c53dc22", //same externalId as above, the user belongs to the company
            },
        }
    ]
}

此时我已经尝试了多种解决方案,但无法达到我的目标。

let query = [{
        $match : { _id : companyId }
    },{
        $lookup : {
            from: 'companies',
            localField : 'professionals_customers.company',
            foreignField : '_id',
            as : 'professionalsCustomers'
        }
    },{
        $lookup : {
            from: 'users',
            localField : 'professionals_customers.contact',
            foreignField : '_id',
            as : 'contacts'
        }
    }]

此时,我已经有了两个包含所有所需信息的新数组,但我不知道如何将正确的联系人与正确的公司分组。另外,尝试填充数据(使用 $lookup)并保持初始结构可能比尝试通过共享 externalId 重新组合 professionalCustomers 和联系人更容易。

附加信息:

- 属于一个公司的用户具有相同的externalId。

-我不想使用经典的填充,之后我需要做一些其他操作


尝试这个查询:

db.companies.aggregate([
    { $match: { _id: companyId } },
    { $unwind: "$professionals_customers" },
    {
        $lookup: {
            from: "companies",
            localField: "professionals_customers.company",
            foreignField: "_id",
            as: "professionals_customers.company"
        }
    },
    {
        $lookup: {
            from: "users",
            localField: "professionals_customers.contact",
            foreignField: "_id",
            as: "professionals_customers.contact"
        }
    },
    {
        $addFields: {
            "professionals_customers.company": {
                $arrayElemAt: ["$professionals_customers.company", 0]
            },
            "professionals_customers.contact": {
                $arrayElemAt: ["$professionals_customers.contact", 0]
            }
        }
    },
    {
        $group: { _id: "$_id", professionals_customers: { $push: "$professionals_customers" }, data: { $first: "$$ROOT" } }
    },
    { $addFields: { "data.professionals_customers": "$professionals_customers" } },
    { $replaceRoot: { newRoot: "$data" } }
])

Test : MongoDB 游乐场 https://mongoplayground.net/p/A367frr_duO

Note :如果需要,您需要转换类型的字段/输入string to 对象 ID()。基本的事情是您需要检查正在比较的两个字段的类型或数据库中的输入字段是否匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 聚合:双重查找,并将查找响应合并到各个对象 的相关文章

随机推荐