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