Mongodb Mongo查询:如何使用DBRef进行$lookup

Mongodb Mongo查询:如何使用DBRef进行$lookup,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在使用DBRef查找$lookup时遇到问题。我在任何地方都找不到下面场景的解决方案。有人帮我吗 假设集合是A { "_id" : ObjectId("582abcd85d2dfa67f44127e0"), "status" : NumberInt(1), "seq" : NumberInt(0) } B组: { "_id" : ObjectId("582abcd85d2dfa67f44127e1"), "Name" : "from B Collection" "bid" :

我在使用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启动聚合,因为引用所在的位置是集合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匹配项分组到一个数组中,则可能需要执行a
groupBy

是否必须在此处将数据存储为db ref
“bid”:DBRef(“B”,ObjectId(“582abcd85d2dfa67f44127e0”)
?或者您可以将其存储为类似于
“bid”:ObjectId(“582abcd85d2dfa67f44127e0”)
的内容吗?我们有绝大多数DBRef数据,因此我必须找到一个查询来引入上述的集体输出。我不确定将所有数据(TB)的DBRef转换为ObjectId需要多少努力。有人能在这里帮助我吗?非常感谢Katherine提供的解决方案。它正在工作。我会更好地提到我的情景。我总共有5个集合使用DBRef引用一个集合(即集合A的_id是集合B、C、D&e的外键)。如果我稍微扩展一下,这个解决方案有效吗?在输出中,我需要收集一个文档以及文档B、C、D&E数据及其标签。对不起,之前没有提到我的具体要求。有人能帮忙吗?