Mongodb递归查询

时间:2017-03-14 13:26:25

标签: mongodb recursion aggregation-framework

我的taxon集合中有以下架构:

{ 
  "_id": 1, 
  "na": [ "root_1",
        "root_2",
        "root_3" ], 
  "pa": 1 
},{
  "_id": 2, 
  "na": [ "name_1", 
        "name_2", 
        "name_3"], 
  "pa": 1
},{
  "_id": 4, 
  "na": [ "otherName_1", 
        "otherName_2", 
        "otherName_3"],
  "pa": 2
}

每个文档都通过父字段与另一个文档相关联,该字段对应于其父项的 _id

我想执行递归搜索以获得以下结果:

{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
} 

从包含某个 _id 的文档中,获取每个父级的 na 数组的第一项,直到包含_id: 1的文档为止到达

我目前通过执行X查询获得此结果(一个通过父文档,例如3个),但我非常确定这可以使用单个查询来实现。我已经查看了新的$graphLookup运算符,但无法设法使用它...

是否可以使用MongoDB 3.4.1在单个查询中实现此目的?

修改

我每次都会运行50个文档,因此最佳解决方案是将所有内容组合在一个查询中

例如,它看起来像

var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
  {$match: 
     { _id: {$in: listId}}
  }, ...
)];  

并输出:

[{ "_id": 4, 
  "nameList": [ "otherName_1",
              "name_1",
              "root_1"]
}, { "_id": 128, 
  "nameList": [ "some_other_ame_1",
              "some_name_1",
              "root_1"]
}, { "_id": 553, 
  "nameList": [ "last_other_ame_1",
              "last_name_1",
              "root_1"]
} ... ]

在线试用:mongoplayground.net/p/Gfp-L03Ub0Y

1 个答案:

答案 0 :(得分:9)

您可以尝试以下聚合。

阶段$graphLookup

nameList'sna db.taxon.aggregate([{ $match: { _id: { $in: listId } } }, { $graphLookup: { from: "taxon", startWith: "$_id", connectFromField: "pa", connectToField: "_id", as: "nameList" } }, { $project: { nameList: { $reduce: { input: "$nameList", initialValue: [], in: { "$concatArrays": ["$$value", { $slice: ["$$this.na", 1] }] } } } } }]) {{1}}数组中选择第一个元素。

{{1}}