【发布时间】:2015-09-25 08:53:58
【问题描述】:
我创建了一个具有以下属性的模型:
- 身份证
- 孩子们
- 父母
如果父级设置为空,文档将被视为顶级父级。每个文档可能有也可能没有子列表,其中仅包含其他文档的 ID。
db.categories.insert( { _id: "MongoDB", children: [],name: '', parent: 'Databases'} )
db.categories.insert( { _id: "dbm", children: [], parent: 'Databases' } )
db.categories.insert( { _id: "Databases", children: [ "MongoDB", "dbm" ], parent: 'Programming' } )
db.categories.insert( { _id: "Languages", children: [], parent: 'Programming' } )
db.categories.insert( { _id: "Programming", children: [ "Databases", "Languages" ],parent: 'books' } )
db.categories.insert( { _id: "Books", children: [ "Programming" ],parent: null } )
从上面的模型中,我需要生成这样的输出:
{
name: "books",
nodes: [
{
name: "Programming",
nodes: [
{
name: "Databases",
nodes: [
{
name: "MonogoDB"
},
{
name: "dbm"
}
]
},
{
name: "Languages"
}
]
}
]
}
到目前为止我已经尝试过了,但是由于 findByID() 的异步性质,我没有得到想要的结果。请提出更改建议。
myDoc.find({
parent: null
}, function (err, topics) {
if (err) {
return handleError(res, err);
}
var docTree = [];
_.each(document, function(parentDoc) {
var doc = {};
doc.text = parentDoc.name;
doc.nodes = [];
_.each(parentDoc.children, function(child) {
doc.nodes.push(processChildren(child));
});
docTree.push(doc);
});
function processChildren(child) {
myDoc.findById(child, function (err,item) {
var doc = {};
doc.name = item._doc.name;
doc.nodes = [];
if (item._doc.children === null) {
return topic;
} else {
_.each(item._doc.children, function (chld) {
processChildren(chld);
});
}
return doc;
});
};
【问题讨论】:
标签: node.js mongodb mongoose promise asynccallback