Как только вы изменили свои поля parentId
на целые числа, чтобы соответствовать полям _id
, вы можете сделать это:
db.files.aggregate([{
$graphLookup: {
from : 'files',
startWith: '$parentId',
connectFromField: 'parentId',
connectToField: '_id',
as: 'parents'
}
}, {
$graphLookup: {
from : 'files',
startWith: '$_id',
connectFromField: '_id',
connectToField: 'parentId',
as: 'children'
}
}])
Исходя из вашего комментария, может показаться, что вы захотите добавить этап $match
в начале, чтобы запросить конкретный этап _id
и $project
в конце, чтобы обрезать вывод до требуемого:
db.files.aggregate([{
$match: {
_id: 3
}
}, {
$graphLookup: {
from : 'files',
startWith: '$parentId',
connectFromField: 'parentId',
connectToField: '_id',
as: 'parents'
}
}, {
$graphLookup: {
from : 'files',
startWith: '$_id',
connectFromField: '_id',
connectToField: 'parentId',
as: 'children'
}
}, {
$project: {
"parents._id": 1,
"parents.name": 1,
"children": 1,
}
}])