Обход древовидной структуры с использованием mongoDB - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в mongodb и пытаюсь агрегировать. Мне нужна помощь по следующей проблеме. У меня есть такая коллекция

{_id: 1,  parentId: null, name: 'foo'},
{_id: 2,  parentId: '1', name: 'boo'},
{_id: 3,  parentId: '2', name: 'koo'},
{_id: 4,  parentId: '3', name: 'coo'}
{_id: 5,  parentId: '4', name: 'loo'}

Я хотел бы выполнить агрегацию и получить список родителей и детей с идентификатором. Как мне этого добиться? заранее спасибо.

Я пробовал graphLookup из mongodb, но не получил ожидаемого результата. Я попробовал это.

    db.files.aggregate([ { $graphLookup: {
     from : 'files',
     startWith: '$id',
     connectFromField: 'parentId',
     connectToField: 'id',
     as: 'parents'
}}])

выходной формат, который мне требуется:

{
id: id,
parents: [{id, name}],
children: []
}

1 Ответ

0 голосов
/ 27 августа 2018

Как только вы изменили свои поля 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,
    }
}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...