0

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

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

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

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

对于第 2 阶段,我正在做 my $lookup,如下所示:

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

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

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

我遇到的问题是,例如,如果“覆盖”——来自主集合——在数组中有多个对象,那么相同的“付款人”信息——来自辅助集合- 正在为其中的每一个而投入使用。所以基本上索引是关闭的。覆盖数组中的每个对象都应该有不同的 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,

        }
    ]

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

4

1 回答 1

1

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

就像是

第二阶段

{"$unwind":"$coverage"}

第三阶段

{ "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"}}}
于 2018-03-08T18:59:21.893 回答