在mongodb中获取叶节点根之前的所有层次结构父节点

在mongodb中获取叶节点根之前的所有层次结构父节点,mongodb,mongodb-query,Mongodb,Mongodb Query,您好,我正在以下面的格式在NoSQL中存储文件夹树结构 Document{{_id=587bedc1da0847d7ad8b7056, name=firstlevel, parent_folder=null}} Document{{_id=587beddcda0847d7ad8b7057, name=secondlevel, parent_folder=firstlevel}} Document{{_id=587bedf2da0847d7ad8b7058, name=thirdlevel, pa

您好,我正在以下面的格式在NoSQL中存储文件夹树结构

Document{{_id=587bedc1da0847d7ad8b7056, name=firstlevel, parent_folder=null}}
Document{{_id=587beddcda0847d7ad8b7057, name=secondlevel, parent_folder=firstlevel}}
Document{{_id=587bedf2da0847d7ad8b7058, name=thirdlevel, parent_folder=secondlevel}}
我需要获得
thirdlevel
的父级,其中我的输出应包括
firstlevel
secondlevel
thirdlevel
(可选,因为我已经知道我处于哪个级别)。有人能告诉我我需要遵循什么样的模型树结构吗?或者在没有父、子、祖先、路径等模型树结构的情况下可以这样做吗


提前感谢。

对于当前的Mongo 3.4版本,您可以使用
$graphLookup

如果你有下面这样的东西

{
    "_id": ObjectId("587bedc1da0847d7ad8b7056"),
    "name": "firstlevel",
    "parent_folder": null
} {
    "_id": ObjectId("587beddcda0847d7ad8b7057"),
    "name": "secondlevel",
    "parent_folder": "firstlevel"
} {
    "_id": ObjectId("587bedf2da0847d7ad8b7058"),
    "name": "thirdlevel",
    "parent_folder": "secondlevel"
}
查询所有家长

db.nodes.aggregate([{
    $graphLookup: {
        from: "nodes",
        startWith: "$name",
        connectFromField: "parent_folder",
        connectToField: "name",
        as: "parents",
    }
}]);
添加一个匹配阶段,用于查询父级的
thirdlevel

{$match:{name:"thirdlevel"}}
样本输出:

{
    "name": "thirdlevel",
    "parents": [{
        "_id": ObjectId("587beddcda0847d7ad8b7057"),
        "name": "secondlevel",
        "parent_folder": "firstlevel"
    }, {
        "_id": ObjectId("587bedc1da0847d7ad8b7056"),
        "name": "firstlevel",
        "parent_folder": null
    }, {
        "_id": ObjectId("587bedf2da0847d7ad8b7058"),
        "name": "thirdlevel",
        "parent_folder": "secondlevel"
    }]
}

在当前的Mongo 3.4版本中,您可以使用
$graphLookup

如果你有下面这样的东西

{
    "_id": ObjectId("587bedc1da0847d7ad8b7056"),
    "name": "firstlevel",
    "parent_folder": null
} {
    "_id": ObjectId("587beddcda0847d7ad8b7057"),
    "name": "secondlevel",
    "parent_folder": "firstlevel"
} {
    "_id": ObjectId("587bedf2da0847d7ad8b7058"),
    "name": "thirdlevel",
    "parent_folder": "secondlevel"
}
查询所有家长

db.nodes.aggregate([{
    $graphLookup: {
        from: "nodes",
        startWith: "$name",
        connectFromField: "parent_folder",
        connectToField: "name",
        as: "parents",
    }
}]);
添加一个匹配阶段,用于查询父级的
thirdlevel

{$match:{name:"thirdlevel"}}
样本输出:

{
    "name": "thirdlevel",
    "parents": [{
        "_id": ObjectId("587beddcda0847d7ad8b7057"),
        "name": "secondlevel",
        "parent_folder": "firstlevel"
    }, {
        "_id": ObjectId("587bedc1da0847d7ad8b7056"),
        "name": "firstlevel",
        "parent_folder": null
    }, {
        "_id": ObjectId("587bedf2da0847d7ad8b7058"),
        "name": "thirdlevel",
        "parent_folder": "secondlevel"
    }]
}