我试图了解为什么我在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
的结果,如何获得在此寻找的数据结构?
为进一步澄清,他们在文档中提到了$unwind
之前是数组字段的$lookup
之前。但是,在这种情况下,目标本地实际字段并由$lookup
代替的实际本地字段不是数组,而是在数组内。所以我不清楚是什么问题。
答案 0 :(得分:1)
您需要使用$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" },
}}
])
答案 1 :(得分:0)
基本上,OP寻找的是在查找到另一个集合后将数据转换为所需格式。假设有两个集合C1
和C2
,其中C1
包含文档
{ "_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的预期非常接近。
注意:可能会有一些极端情况,但需要进行一些细微调整,此解决方案应该有效