检索按路径排序的树并与孩子一起构建Json树

时间:2018-07-18 06:03:11

标签: javascript mongodb mongoose tree

我正在尝试减少构建JSON格式的子树所需的时间。  目前,我正在使用parentID并递归查询mongo。具有某些文件夹结构深度为5或6层的文件结构需要20到30秒的处理时间。因此,我试图找到一种方法来查询数据库一次,然后有效地对数据进行排序。

我一直在尝试使用物化路径,但不确定如何正确订购它们。

我收到的数据如下:

[{
    id:<objectId_1>,
    path:'#<stringId_1>#'
},
{
    id:<objectId_2>,
    path:'#<stringId_2>#'
},
{
    id:<objectId_3>,
    path:'#<stringId_1>#<stringId_3>#'
},
{
    id:<objectId_4>,
    path:'#<stringId_2>#<stringId_4>#'
}]

这将构建树以在<objectId_2>中具有两个子节点。如果我的查询可以某种方式按后代组排序,则我认为此方法会有效。像这样:

[{
    id:<objectId_1>,
    path:'#<stringId_1>#'
},
{
    id:<objectId_3>,
    path:'#<stringId_1>#<stringId_3>#'
},
{
    id:<objectId_2>,
    path:'#<stringId_2>#'
},
{
    id:<objectId_4>,
    path:'#<stringId_2>#<stringId_4>#'
}]

这是我目前正在构建树的工作,它将所有子节点返回到推送到正在构建的数组的最后一个节点。

_dbBuildTreeByIDPM: (id) => {

        let tplNode = [];

        return new Promise((resolve, reject) => {
            db.folders.find({"_user": id}).sort({"_path":-1}).exec(function(err, folder){

                let collectFolder = folder => {
                    return  {
                        name: folder._name,
                        parentNode: folder._parent_folder_id,
                        path: folder._path,
                        id: folder._id,
                        level: folder.level, 
                        childNodes: []
                    }

                }

                let createChildNode = (folder, currentNode, level) => {

                    if(level == 1){
                        folder.push(collectFolder(currentNode));
                    }else{
                        createChildNode(folder[folder.length -1]['childNodes'], currentNode, level - 1);
                    }
                    return;

                }

                for(let k in folder){
                   createChildNode(tplNode, folder[k],folder[k].level -1);
                }
            resolve(tplNode)
    });

0 个答案:

没有答案