我脚本从mongodb获取数据以推送JSON格式的数据,并带有获取子数据的函数:
var tree = [];
orgchart.find({ _client: "558f030fd1bdb6ee1859c279", _parent: "root" }, function(err,doc){
// function get child
getChild = function(_client, _parent){
var dj = [];
orgchart.find({ _client : _client, _parent: _parent }, function(err, doc1){
var jsonData1 = JSON.parse(JSON.stringify(doc1));
if(jsonData1.length > 0){
for(var j=0; j<jsonData1.length; j++){
dj.push({ 'text' : '"'+jsonData1[j].name+'"' });
console.log(jsonData1[j].name);
}
}
});
return dj;
};
var jsonData = JSON.parse(JSON.stringify(doc));
if(jsonData.length > 0){
for(var i=0; i<jsonData.length; i++){
tree.push({
'text' : jsonData[i].name,
'children' : JSON.parse(JSON.stringify(getChild(jsonData[i]._client, jsonData[i]._id)))
});
}
}
res.send(tree);
});
我从控制台日志得到了结果:
Level 2A
Level 2B
但是在JSON数据中是空的
[
{
"text": "Level 1",
"children": []
},
{
"text": "Level 1B",
"children": []
}
]
我需要这样的数据:
[
{
"text": "Level 1",
"children": [{ "text": "Level 2A" }]
},
{
"text": "Level 1B",
"children": [{ "text": "Level 2B" }]
}
]
我的代码有什么问题,我是Node JS的新手
答案 0 :(得分:0)
使用async.map解决它
这是我的剧本:
orgchart.find({ _client: "558f030fd1bdb6ee1859c279", _parent: "root" }, function(err, doc){
if(err){
callback(err.message);
}
async.map(doc,
// get child from each item
function(item, callback){
// child query
orgchart.find({ _client: item._client, _parent: item._id }, function(err, doc){
var doc1 = [];
for(var i=0; i<doc.length; i++){
doc1.push({ 'level 2': doc[i].name });
}
var data = { 'level 1': item.name, 'children': doc1 };
callback(null, data);
});
},
// show result
function(err, results){
res.send(results);
}
);
});
结果是:
[
{
"level 1": "Level 1",
"children": [
{
"level 2": "Level 2A"
},
{
"level 2": "Level 2B"
}
]
},
{
"level 1": "Level 1B",
"children": []
}
]
感谢@DevAlien先生推荐使用async libray(https://github.com/caolan/async)