Mongo Query:如何使用DBRef进行$ lookup

时间:2019-05-15 22:13:46

标签: 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("B", ObjectId("582abcd85d2dfa67f44127e0"))   }

我花了很多时间来汇总以上两个集合。我正在寻找以下输出。

{ 
"_id" : ObjectId("582abcd85d2dfa67f44127e0"),  
"status" : NumberInt(1), 
"seq" : NumberInt(0),
B: [
    {
        "_id" : ObjectId("582abcd85d2dfa67f44127e1"),
        "Name" : "from B Collection"
    }
]}

请帮助我进行Mongo查询,以上述格式检索结果。预先感谢

1 个答案:

答案 0 :(得分:0)

理想情况下,您可以将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