mongodb - Mongo 查询 : how to $lookup with DBRef

标签 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 查询以检索上述格式的结果。提前致谢

最佳答案

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

相关文章:

node.js - 一对多 Mongoose 关系 - 在哪里存储引用

c# - 在 MongoDB 集合中获取前 10 个结果

python - 如何使用 MongoDB 2.4 对 2d 或 2dsphere 索引字段使用常规查询

mongodb - 从 mongodb 中的嵌套数组文档的第三层查找计数

java - 配置问题: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www. springframework.org/schema/data/mongo]

java - 带有java的Mongodb - 查找批量大小的查询

mongodb - 无法在 Ubuntu 18.4LTS 上安装 CURL(需要 libcurl4),但安装它会删除 libcurl3,因此 mongo 无法正常工作

mongodb - $map 中存在多个 'in' 表达式

node.js - 没有$ unwind的$ lookup多个级别?

具有来自多个文档的数组对象值总和的 MongoDB 聚合