我在使用DBRef的$ lookup时遇到麻烦。我在任何地方都找不到以下情况的解决方案。有人请帮我吗?
假设集合A为
{
"_id" : ObjectId("582abcd85d2dfa67f44127e0"),
"status" : NumberInt(1),
"seq" : NumberInt(0) }
集合B:
{
"_id" : ObjectId("582abcd85d2dfa67f44127e1"),
"Name" : "from B Collection"
"bid" : DBRef("B", ObjectId("582abcd85d2dfa67f44127e0")) }
我花了很多时间来汇总以上两个集合。我正在寻找如下的输出。
{
"_id" : ObjectId("582abcd85d2dfa67f44127e0"),
"status" : NumberInt(1),
"seq" : NumberInt(0),
B: [
{
"_id" : ObjectId("582abcd85d2dfa67f44127e1"),
"Name" : "from B Collection"
}
]}
请帮助我进行Mongo查询,以上述格式检索结果。提前致谢
理想情况下,您将能够将DBRef更改为普通的objectId或仅更改为字符串类型。正如指出的这个帖子,也可以在令人费解的查询使用DBREF。关键是一个$ addFields阶段,{$objectToArray: "$$ROOT.bid"}
用于将DBRef值转换为可用格式。
您需要从集合B开始聚合,因为那是引用所在的位置,并且DBRef需要在查找之前进行按摩。知道是这种情况,目标输出形状可能会改变;但是,以下汇总可以帮助您获得所需的信息:
db.getCollection('B').aggregate([
{$addFields: {fk: {$objectToArray: "$$ROOT.bid"}}},
{$lookup: {
from: 'A',
localField: 'fk.1.v',
foreignField: '_id',
as: 'A'
}},
// the below is transforming data into the format in the example
{$addFields: {'A.B': {_id: '$_id', Name: '$Name'}}},
{$unwind: '$A'},
{$replaceRoot: {newRoot: '$A'}}
])
如果需要将groupBy
多个B匹配分组到一个数组中,则可能需要执行a 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句