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

3

我有一个关于使用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吗 "bid" : DBRef("B", ObjectId("582abcd85d2dfa67f44127e0"))?或者你能够将其存储为类似于 "bid" : ObjectId("582abcd85d2dfa67f44127e0") 的东西吗? - Katherine R
我们的绝大部分数据都是使用DBRef存储的,因此我必须找到一个查询来将上述集体输出带入。我不确定将所有数据(以太字节)从DBRef转换为ObjectId需要多少工作量。 - SantoshVysyaraju
有人能帮帮我吗? - SantoshVysyaraju
1个回答

9
理想情况下,您可以将DBRef更改为普通的objectId或字符串类型。如此帖子所述,在查找中使用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操作。


非常感谢Katherine提供的解决方案,它很有效。我应该更好地说明我的情况。我有5个集合,它们使用DBRef引用一个集合(即Collection A的_id是Collection B、C、D和E的外键)。如果我稍微扩展一下这个解决方案,它是否仍然有效?在输出中,我需要Collection A文档以及带有标签的Document B、C、D和E数据。很抱歉之前没有准确说明我的要求。 - SantoshVysyaraju
有人可以帮忙吗? - SantoshVysyaraju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接