Започвайки от MongoDB 3.4, можем да направим това с Aggregation Framework.
Първият и най-важен етап в нашия процес е $graphLookup
сцена. $graphLookup
позволява рекурсивно съпоставяне на полето "родител" и "име". Като резултат получаваме предците на всяко "име".
Следващият етап в процеса е $match
етап, където просто избираме „името“, което ни интересува.
Последният етап е $addFields
или $project
етап, където прилагаме израз към масива "предци", използвайки $map
оператор за масив.
Разбира се с $reverseArray
оператор ние обръщаме нашия масив
за да получите очаквания резултат.
db.collection.aggregate(
[
{ "$graphLookup": {
"from": "collection",
"startWith": "$parent",
"connectFromField": "parent",
"connectToField": "name",
"as": "ancestors"
}},
{ "$match": { "name": "D" } },
{ "$addFields": {
"ancestors": {
"$reverseArray": {
"$map": {
"input": "$ancestors",
"as": "t",
"in": { "name": "$$t.name" }
}
}
}
}}
]
)