@ Цезарь Это стоило написать, потому что ты не будешь последним спрашивать об этом. Люди уже спрашивают его сейчас, кто еще не знает, что эти функции "преобразования" идут. Как только он достигнет производства, я бы ожидал, что количество людей, пытающихся его увеличить, только увеличится. Так что "спасибо за вопрос", я думаю.
аюсь запустить$graphLookup
как показано на рисунке ниже:
Цель состоит в том, чтобы, учитывая конкретную запись$match
там), восстановить его полный путьimmediateAncestors
свойство. Как видите, этого не происходит.
Я ввел$convert
здесь, чтобы иметь дело с_id
из коллекции какstring
полагая, что это можно было бы "сопоставить" с_id
изimmediateAncestors
список записей (который являетсяstring
).
Итак, я запустил еще один тест с другими данными (нетObjectId
участвует):
db.nodos.insert({"id":5,"name":"cinco","children":[{"id":4}]})
db.nodos.insert({"id":4,"name":"quatro","ancestors":[{"id":5}],"children":[{"id":3}]})
db.nodos.insert({"id":6,"name":"seis","children":[{"id":3}]})
db.nodos.insert({"id":1,"name":"um","children":[{"id":2}]})
db.nodos.insert({"id":2,"name":"dois","ancestors":[{"id":1}],"children":[{"id":3}]})
db.nodos.insert({"id":3,"name":"três","ancestors":[{"id":2},{"id":4},{"id":6}]})
db.nodos.insert({"id":7,"name":"sete","children":[{"id":5}]})
И запрос:
db.nodos.aggregate( [
{ $match: { "id": 3 } },
{ $graphLookup: {
from: "nodos",
startWith: "$ancestors.id",
connectFromField: "ancestors.id",
connectToField: "id",
as: "ANCESTORS_FROM_BEGINNING"
}
},
{ $project: {
"name": 1,
"id": 1,
"ANCESTORS_FROM_BEGINNING": "$ANCESTORS_FROM_BEGINNING.id"
}
}
] )
... который выводит то, что я ожидал (пять записей прямо и косвенно связаны сid
3):
{
"_id" : ObjectId("5afe270fb4719112b613f1b4"),
"id" : 3.0,
"name" : "três",
"ANCESTORS_FROM_BEGINNING" : [
1.0,
4.0,
6.0,
5.0,
2.0
]
}
Вопрос в том, есть ли способ достичь цели, о которой я говорил в начале?
Я использую Mongo 3.7.9 (из официального Docker)
Заранее спасибо!