Node.js mongoose文档树状结构的递归

Node.js mongoose文档树状结构的递归,node.js,algorithm,mongodb,recursion,mongoose,Node.js,Algorithm,Mongodb,Recursion,Mongoose,我需要帮助通过get请求从数据库中提取对象中的对象,这样我就可以在我的网页上显示所有的对象,但是我运行的这个测试已经失败了,调试失败了,它永远都在运行,而且从来没有收到JSON。我想我的逻辑可能在什么地方搞砸了。我不确定我是否应该使用async来实现这一点,它看起来确实像是一个回调地狱,现在考虑到它,我可能应该这样做,但我不知道在优化中思考这是否是一种体面的方式,我通常从最坏的情况开始,我尝试低于我的目标大约是O(N)因为总共有N个文档,我只是遍历递归树,通过一些额外的查询来查找初始文档,等等,

我需要帮助通过get请求从数据库中提取对象中的对象,这样我就可以在我的网页上显示所有的对象,但是我运行的这个测试已经失败了,调试失败了,它永远都在运行,而且从来没有收到JSON。我想我的逻辑可能在什么地方搞砸了。我不确定我是否应该使用async来实现这一点,它看起来确实像是一个回调地狱,现在考虑到它,我可能应该这样做,但我不知道在优化中思考这是否是一种体面的方式,我通常从最坏的情况开始,我尝试低于我的目标大约是O(N)因为总共有N个文档,我只是遍历递归树,通过一些额外的查询来查找初始文档,等等,N+X(其中X是 我有一个模式,类似这样的

Doc {
title : string,
author : string,
subDoc : [{type: mongoose.Schema.Types.ObjectId, ref : 'Doc'}]
}
因此,我生成了一些文档,每次生成这些文档时,我都有子文档,这些子文档可以存在于这些文档中,甚至这些子文档也可以有子文档。然后我们得到一些树状结构。但是我不想显示文档>然后显示其子文档1>所有子文档。。。etc>其子文档2>其所有子文档..>等

然而,我不知道我所想的是否有效,是否值得对这么多的查询进行处理

app.get('/docs/:doc/subDocTree', function(req, res) {
    var array = [];
    var id = req.params.doc;
    var num_proc = 0;
    console.log(id);
    Doc.findById(id, function(err, doc) {
        console.log(doc);
        for (var x = 0; x < doc.subDoc.length; x++) {
            Doc.findById(form.subDoc[x], function(err, subDoc) {
                populate(subDoc);
            });
        }
        num_proc = num_proc + 1;
        if (num_proc == Doc.subDoc.length) {
            res.json(array);
            array.length = 0;
        }
    });
});

function populate(docs) {
    var num_proc = 0;
    Form.findById(docss, function(err, doc) {
        if (doc.subform.length != 0) {
            //console.log(form);
            var total = doc.subDoc.length;
            for (var i = 0; i < total; i++) {
                array.push(doc.subDoc[x]);
                num_proc = num_proc + 1;
                populate(subDoc[x]);
            }
        }
    });
}
app.get('/docs/:doc/subDocTree',函数(req,res){
var数组=[];
var id=req.params.doc;
var num_proc=0;
console.log(id);
Doc.findById(id,函数(err,Doc){
控制台日志(doc);
对于(var x=0;x

我认为首先搜索文档,然后搜索它的所有子文档,然后使用populate方法递归检查子文档中的任何子文档都可以。然而,我从来没有收到过JSON,通过使用print statements/console.logs进行调试,我仍然无法找出哪里出了问题

您的代码是异步的,不适用于for循环

for (var x = 0; x < doc.subDoc.length; x++) {
    Doc.findById(form.subDoc[x], function(err, subDoc) {
        populate(subDoc);
    });
}
num_proc = num_proc + 1;
if (num_proc == Doc.subDoc.length) {
    res.json(array);
    array.length = 0;
}
然后在模式定义中,我会使用这个深层填充插件

var deepPopulate = require('mongoose-deep-populate');
Doc.plugin(deepPopulate, options);
现在你的路线是这样的:

app.get('/docs/:doc/subDocTree', function(req, res) {
    var id = req.params.doc;

    Doc.findById(id).deepPopulate('subDoc').execAsync()
    .then(function(doc){
        res.json(doc.subDoc);
    }).catch(function(err){
        // handle error
        res.send('Something went wrong...' + err.message);
    });
});

array.push(doc.subDoc[x])行中的
array
是否超出范围?另一件事:通过提供递归的最大深度来避免循环对象,这通常会导致无限循环。是的,数组应该是全局的,谢谢victor。是的,我给了populate方法一个机会,但总的来说,我还需要通过我的所有子文档进行填充吗?例如,如果它是Main->Sub1和Sub2;Sub1>sub3和sub4;Sub>Sub5和sub6如果这是我们的树,那么调用populate将只填充json一次,对吗?本质上,这就是你所建议的异步和承诺的来源?我试过了,但我还是返回了一级填充,而你的意思是返回json时只返回doc,对吗?因为我们是按id找到文档的,并且深度填充了它,而不是子文档。我将尝试阅读更多的文档和我的代码,看看为什么它的填充不能超过一个级别。抱歉,这意味着填充*查看文档,执行。deepPopulate('subDoc.subDoc')应该给我它所做的第二个级别,但它的编写方式似乎不太正常。我以为你为deepPopulate写的东西会查找所有内容的“subDoc”字段并进行填充,如果我们有一致数量的级别,那么就是这样做的。subDoc的subDoc的subDoc的subDoc的subDoc的subDoc只是一种黑客方式,我需要更改
require('mongoose-deep-populate')
要求('mongoose-deep-populate')(mongoose)。这是对1.x的更改,请参见此处的更多内容:
app.get('/docs/:doc/subDocTree', function(req, res) {
    var id = req.params.doc;

    Doc.findById(id).deepPopulate('subDoc').execAsync()
    .then(function(doc){
        res.json(doc.subDoc);
    }).catch(function(err){
        // handle error
        res.send('Something went wrong...' + err.message);
    });
});