我在使用 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 或只是字符串类型。如 this post 中所述,在查找中使用 DBRef 可能会令人费解。关键是一个带有 {$objectToArray: "$$ROOT.bid"}
的 $addFields 阶段,用于将 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'}}
])
如果您需要将多个 B 匹配分组到一个数组中,则可能需要执行
groupBy
。关于mongodb - Mongo 查询 : how to $lookup with DBRef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56158332/