如何确保 $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"}}}
在我的 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"}}}