MongoDB中的$lookup提供了意外的数据结构结果



我试图理解为什么我在MongoDB聚合中使用的$lookup会产生它的结果。

首先,我的初始数据如下所示:

"subscriptions": [
{
"agency": "3dg2672f145d0598be095634", // This is an ObjectId
"memberType": "primary"
}
]

现在,我想做的是一个简单的$lookup,为当前填充为"机构"字段的值填充ObjectId提取相关数据。

我尝试做的是这样的$lookup

{
"from" : "agencies",
"localField" : "subscriptions.0.agency",
"foreignField" : "_id",
"as" : "subscriptions.0.agency"
}

所以,基本上我想做的是获取与该ObjectId参考相关的信息,并在此处填充它,而不是ObjectId当前所在的位置。

我所期望的结果是这样的:

"subscriptions": [
{
"agency": [
{ 
_id: <id-value>,
name: <name-value>,
address: <address-value>
}
],
"memberType": "primary"
}
]

相反,我最终得到了这个(我的"memberType"道具现在无处可寻):

"subscriptions" : {
"0" : {
"agency" : [ <agency-data> ]
}
}

为什么这是$lookup的结果,我如何在这里获得我正在寻找的数据结构?

为了进一步澄清,在文档中,他们提到在数组字段时在$lookup之前使用$unwind。但在这种情况下,被目标并被$lookup替换的实际本地字段不是数组,而是在数组中。所以我不清楚问题是什么。

你需要使用$unwind将你的"localField"与"foreignField"匹配,然后$group再次回滚到数组

db.collection.aggregate([
{ "$unwind": "$subsciption" },
{ "$lookup": {
"from": Agency.collection.name,
"localField": "subsciption.agency",
"foreignField": "_id",
"as": "subsciption.agency"
}},
{ "$group": {
"_id": "$_id",
"memberType": { "$first": "$memberType" },
"subsciption": { "$push": "$subsciption" },
}}
])

基本上,OP 正在寻找的是查找到另一个集合后以所需格式转换数据。假设有两个集合C1C2C1包含文档

{ "_id" : ObjectId("5b50b8ebfd2b5637081105c6"), "subscriptions" : [ { "agency" : "3dg", "memberyType" : "primary" } ] }

并且C2包含

{ "_id" : ObjectId("5b50b984fd2b5637081105c8"), "agency" : "3dg", "name" : "ABC", "address" : "1 some street" }

如果对数据库执行以下查询

db.C1.aggregate([
{$unwind: "$subscriptions"}, 
{
$lookup: {
from: "C2", 
localField: "subscriptions.agency", 
foreignField: "agency", 
as: "subscriptions.agency"
}
}
])

我们得到结果

{
"_id": ObjectId("5b50b8ebfd2b5637081105c6"),
"subscriptions": {
"agency": [{
"_id": ObjectId("5b50b984fd2b5637081105c8"),
"agency": "3dg",
"name": "ABC",
"address": "1 some street"
}],
"memberyType": "primary"
}
}

这与OP的期待非常接近。

注意:可能存在一些边缘情况,但稍作调整,此解决方案应该可以工作

最新更新