我正在尝试减少构建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)
});