使用 mongoDB 遍历树结构



我是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'}

我想执行聚合并获取 id 的父母和子项列表。我怎样才能做到这一点?提前谢谢。

我尝试了 mongodb 的图形查找,但没有按预期得到结果。我试过这个。

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

我需要的输出格式是:

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

一旦你把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,
}
}])

最新更新