从node.js中的mongoDB数据生成JSON树

有很多像这样的问题,但不幸的是我没有find任何适合我的情况。

最近的是从MongoDB Node.Js创build一个JSON树,但它仍然没有按预期工作。

或者,也许我的头不能包装这个问题…

我有架构,我的问题的关键组件如下所示:

var userSchema = new Schema({ _id: {type: Number}, children: [{type: Number, ref: 'User'}] )}; 

每个用户可能有三个孩子的用户,所以它可以无限深入。

幸运的是,我必须涵盖两种情况 –

  1. 从特定用户构buildJSON树最多3个嵌套
  2. 计算来自特定根的10个嵌套的数据。

我尝试在我的express.js api中写这样的recursion函数:

 api.get('/user/tree/:user_id', function (req, res) { var user_id = req.params.user_id; var depth = 0; var root = {}; function walker(parent) { if (depth >= 3) { return res.send('whole data, not just last user'); // this is wrong. it will try to res.send for each iteration of forEach, and it sends only last user. } depth += 1; _.forEach(parent.mlm.childs, function (userid, index) { User.findOneAsync({_id: userid}).then(function(user) { parent.mlm.childs[index] = user; walker(parent.mlm.childs[index]); }); }); } User.findOneAsync({_id: user_id}).then(function(user) { root = user; walker(user, root); }); }); 

但它当然只能遍历树,而不是遍历并创build整个JSON。

我坚持如何能够访问根和发送整棵树。

发送许多res.send的问题可以通过计算迭代来解决,只有在forEach结束时才发送,我猜。

谢谢你的帮助。

好。 我find了解决scheme。

 api.get('/user/tree/:user_id', function (req, res) { var user_id = req.params.user_id; var tree = {}; var counter = 0; var gloCounter = 0; function walker(parent) { gloCounter += 1; if (parent.mlm.childs.length === 0 && gloCounter > counter) { res.send(tree); return; } _.forEach(parent.mlm.childs, function (child, i) { counter += 1; User.findOneAsync({_id: child}) .then(function(child) { parent.mlm.childs[i] = child; var newParent = parent.mlm.childs[i]; walker(newParent); }).catch(function(err) { console.log('error: ' + err); }); }); } User.findOneAsync({_id: user_id}) .then(function(user) { tree = user; walker(tree); }).catch(function(err) { console.log('err: ' + err); }); }); 

它按预期工作 – 遍历整个结构,创buildjson,然后发送回去。 它使用lodash和bluebird promise,对于那些将来可以解决类似问题的人来说,并不了解所有那些“Async”修正和_.forEach发生了什么。