Mongodb聚合:获取引用的文档字段值
Posted
技术标签:
【中文标题】Mongodb聚合:获取引用的文档字段值【英文标题】:Mongodb aggregate: get referenced document field value 【发布时间】:2019-01-17 05:50:50 【问题描述】:我想从引用的文档中获取字段值。 Mongodb 版本是 3.4。
假设我有 2 个集合 foo 和 bar。 Foo 有对 bar 的引用:
"_id" : ObjectId("5b6c713ea502dea387860eba"),
"stack" : "overflow",
"bar" :
"$ref" : "bar",
"$id" : ObjectId("5b6c70e1a502dea387860ea6"),
"$db" : "***"
而对应的bar文件是这样的:
"_id" : ObjectId("5b6c70e1a502dea387860ea6"),
"name" : "bar-2"
我尝试了以下聚合函数来归档此结果:
"_id" : ObjectId("5b6c713ea502dea387860eba"),
"stack" : "overflow",
"barName" : "bar-2"
聚合函数:
db.getCollection('foo').aggregate([
$match: _id: ObjectId("5b6c713ea502dea387860eba") ,
$lookup:
from: 'bar',
localField: 'bar',
foreignField: '_id',
as: "bar"
,
$project:
_id: 1,
stack: "$stack",
barName: "$bar.name"
]).pretty()
但我的结果是这样的:
"_id" : ObjectId("5b6c713ea502dea387860eba"),
"stack" : "overflow",
"barName" : []
我尝试用谷歌搜索它,我查看了 mongodb 文档但无法找到解决方案。
是我遗漏了什么还是这不可能?
谢谢!
【问题讨论】:
【参考方案1】:您需要$unwind
bar
并且您的localField
不仅是bar.id
bar
db.getCollection('foo').aggregate([
"$match": "_id": ObjectId("5b6c713ea502dea387860eba") ,
"$lookup":
"from": "bar",
"localField": "bar.id",
"foreignField": "_id",
"as": "bar"
,
"$unwind": "$bar" ,
"$project":
"_id": 1,
"stack": "$stack",
"barName": "$bar.name"
])
【讨论】:
谢谢,但我已经试过了,据我所知。有了这个查询,我开始Fetched 0 record(s) in 0ms
。我还缺少什么吗?
你在用猫鼬吗?因为您的数据库名称可能在这里不正确
不,我目前在本地安装的 mongodb 上的 robo 3t
-shell 中。但是该文档确实创建了 symfony(学说 mongodb-odm),如果您想知道的话
我还看到,如果我只做 $lookup
而没有 $project
和 $unwind
比 bar
是一个空数组。这是预期的行为吗?或者这是否给我暗示$lookup
无法正常工作(就像你说的,可能使用不正确的数据库名称或相等)
您的 bar
应该包含对象数组 [ "_id" : ObjectId("5b6c70e1a502dea387860ea6"), "name" : "bar-2" ]
... 我认为您的数据库名称不正确【参考方案2】:
由于我没有找到解决问题的方法,所以我找到了issue。看来目前这对于 mongodb DBRef() 字段是不可能的。
【讨论】:
以上是关于Mongodb聚合:获取引用的文档字段值的主要内容,如果未能解决你的问题,请参考以下文章
在 MongoDB 的聚合管道中获取 $group 之后的输入文档中的字段