如何确保 $lookup 映射到 MongoDB 视图中正确对应的对象

How to Ensure $lookup Maps to Correctly Corresponding Object in MongoDB View

在我的 MongoDB/Node 后端中,我正在使用 Studio 3T 创建视图以 return 集合中的某些数据子集。我也在做 $lookup 从第二个集合中引入一些数据,并将其注入到 mongoID 通常作为对另一个集合的引用出现的位置。

然后我使用 $project 来塑造数据的显示方式。

这是我最初 $project 的样子,这是我管道的第 1 阶段:

{ "name" : 1.0, "dob" : 1.0, "coverage" : 1.0, "payer" : 1.0 }

对于第 2 阶段,我正在做我的 $lookup,它看起来像这样:

{ "from" : "payers", "localField" : "coverage.payer", "foreignField" : "_id", "as" : "payerInfo" }

最后,我将通过如下步骤塑造数据的外观:

"coverage" : { "payer" : { "id" : "$payerInfo._id", "name" : "$payerInfo.name" }

我 运行 遇到的问题是,例如,如果来自主集合的 "coverage" 在数组中有多个对象,那么相同的 "payer" 信息 -- 来自辅助集合 -- 被放入 each 中。所以基本上索引是关闭的。 coverage 数组中的每个对象应该有不同的 payerId 和 payerName。

什么操作可以运行 确保正确对应的付款人信息(通过 $lookup 从第二个集合中提取)被放入 "coverage" 数组中的适当对象中?

下面是输出数据的样子(而且,正如我所说,这是不正确的。现在相同的付款人信息被添加到 "coverage" 数组中的两个对象,而这些应该是不同的).

    "coverage": [
        {
            "payer": {
                "id": [
                    "12345"
                ],
                "name": [
                    {
                        "long": "National United",
                        "short": "NU"
                    }
                ]
            },
            "field2": value,
            "field3": value,
            "field4": value,
        },
        {
            "payer": {
                "id": [
                    "12345"
                ],
                "name": [
                    {
                        "long": "National United",
                        "short": "NU"
                    }
                ]
            },
            "field2": value,
            "field3": value,
            "field4": value,

        }
    ]

我可以向视图管道添加什么额外的操作来解决这个问题?

$lookup 之前使用 $unwind 并添加 $unwind$addFields 以包含您从联合集合文档和另一个 [=20= 中选择的字段] 将匹配的付款人信息移动到覆盖范围中,并在 $project 之后的 $group 阶段将所有覆盖范围拉入 3.4 版本中的数组。

类似

第 2 阶段

{"$unwind":"$coverage"}

第 3 阶段

{ "from" : "payers", "localField" : "coverage.payer", "foreignField" : "_id", "as" : "payerInfo" }

第 4 阶段

 {"$unwind":"$payerInfo"}

第 5 阶段

{"$addFields":{ "payerInfo" : { "id" : "$payerInfo._id", "name" : "$payerInfo.name" }

第 6 阶段

{"$addFields":{"coverage.payer":"$payerInfo"}}

第 7 阶段

{"$project":{"payerInfo":0}}

第 8 阶段

{"$group":{"_id":"$_id", "coverage":{"$push":"$coverage"}}}