gpt4 book ai didi

node.js - 树状 Mongoose 文档结构的递归

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:04 24 4
gpt4 key购买 nike

我需要帮助通过 get 请求从我的数据库中提取对象的对象,以便我可以在我的网页上显示所有对象,但是我运行的这个测试已经失败,调试它,它永远运行并且 JSON 是从未收到。我认为我的逻辑可能在某处搞砸了。我不确定我是否应该为此使用异步,它看起来确实像回调 hell ,现在考虑我可能应该这样做,但我不知道是否考虑优化这是否是一种体面的方式,我通常从最坏的情况,我尝试低于我的目标是 O(N) 因为总共有 N 个文档,我只是遍历递归树,还有一些额外的查询来查找初始文档和什么不是这样,N+X(其中 x 是额外的查询量 < N)。但我觉得我好像在概念上错过了一些东西,好像可能有更好的方法。

我有一个模式,像这样

Doc {
title : string,
author : string,
subDoc : [{type: mongoose.Schema.Types.ObjectId, ref : 'Doc'}]
}

所以我生成了一些文档,每次我生成这些文档时,我都有可以为这些文档存在的子文档,甚至那些子文档也可以有子文档。然后我们最终得到一些树状结构。但是我不想显示文档 > 然后是它的 sub_doc1 > 它的所有子文档...等 > 它的子 doc2 > 它的所有子文档..> 等..

但是我不知道我的想法是否有效,是否值得进行这么多查询。

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]);
}
}
});
}

我认为首先搜索文档,然后搜索它的所有子文档,然后使用 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;
}

res.json(array) 将在 populate(subDoc)

之前执行

您应该使用异步库或 promises 来处理这个问题。

mongoose 也已经有一个内置的方法来填充子文档。


****更新****

看来您将从本模块中受益:deep-populate

结合这里的 promise ,我将如何重写您的代码:

首先,我将 promise mongoose 对象(使用 bluebird )

// Promisification
var Promise = require('bluebird');
var mongoose = require('mongoose');
Promise.promisifyAll(mongoose);

然后在模式定义中我将使用那个深度填充插件

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);
});
});

关于node.js - 树状 Mongoose 文档结构的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com