我的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"]
} ... ]
答案 0 :(得分:9)
您可以尝试以下聚合。
阶段$graphLookup
。
nameList's
从na
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}}