Ссылки: https://docs.mongodb.com/manual/tutorial/model-tree-structures-with-parent-references/index.html и https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#pipe._S_graphLookup.
Идея состоит в том, чтобы отфильтровать (оператор match
) запрошенный документ, а затем использовать агрегатную функцию graphLookup
(проверить все ограничения, например, max memory)
db.getCollection('comments').aggregate([
{
$match : { "ContentId" : 1.0 }
},
{
$graphLookup: {
from: 'comments',
startWith: "$ContentId",
connectFromField: "ContentId",
connectToField: "ParentContentId",
as: "hierarchy"
}
}])
Это вернет объект, который соответствует добавленному массиву иерархии, показывая всех потомков, что-то вроде этого:
...
"hierarchy" : [
{
"id" : 3,
"type" : "added",
"text" : "c3",
"parentId" : 1
},
{
"id" : 4,
"type" : "added",
"text" : "c4",
"parentId" : 3
},
{
"id" : 2,
"type" : "added",
"text" : "c2",
"parentId" : 1
}
]
...
"hierarchy" : [
{
"id" : 3,
"type" : "added",
"text" : "c3",
"parentId" : 1
},
{
"id" : 4,
"type" : "added",
"text" : "c4",
"parentId" : 3
},
{
"id" : 2,
"type" : "added",
"text" : "c2",
"parentId" : 1
}
]
Вы должны посмотретьна https://docs.mongodb.com/manual/applications/data-models-tree-structures/, чтобы увидеть, будут ли другие методы моделирования лучше для вашего сценария.