Мне нужна помощь, вытаскивающая объекты объектов из моей базы данных через запрос на получение, поэтому я могу отобразить все это на своей веб-странице, но этот тест, который я выполнял, уже не удался, отлаживая его, он просто работает вечно, и JSON так и не получил. Я думаю, что моя логика может быть испорчена. Я не уверен, должен ли я использовать async для этого, это похоже на обратный ад, и теперь, думая об этом, я, вероятно, должен, но я не знаю, думает ли в оптимизации, если это приличный способ, я обычно начинаю с в худшем случае, и с попыткой, с которой я столкнулся ниже того, к чему я стремился, было около O (N), так как есть N полных документов, и я просто пересекаю дерево рекурсии, с некоторыми дополнительными запросами на поиск исходных документов и что не так, N + X (где x - дополнительное количество запросов < N). Но мне кажется, что я пропускаю что-то концептуально, как будто может быть лучший способ.Рекурсия на дереве как структура документов мангуста
У меня есть схема, что-то вроде этого
Doc {
title : string,
author : string,
subDoc : [{type: mongoose.Schema.Types.ObjectId, ref : 'Doc'}]
}
Таким образом, есть документы, которые я генерировать и каждый раз, когда я произвожу эти документы у меня есть поддокументы, которые могут существовать в этих документах, и даже те, вложенные документы могут иметь поддокументы. Затем мы получаем некоторую древовидную структуру. Однако я не буду отображать Документ>, а затем его sub_doc1> все его поддомены ... и т. Д.> Его sub 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]);
}
}
});
}
Я думал, что поиск документа, а затем поиска все его поддокументов, затем рекурсивно проверять с помощью метода заселить для любых subdocs из subdocs будет работать. Тем не менее, я никогда не получаю JSON, и, отлаживаясь с помощью операторов печати/console.logs, я все еще не мог понять, где я ошибся.
Не 'array' из области видимости в линии 'Array.push (doc.subDoc [х]);'? – dcco
Другое: избегать круговых объектов, обеспечивая максимальную глубину рекурсии, которая обычно может привести к бесконечному циклу. –
Да, массив, он должен быть глобальным и благодарить победителя. – Karan