Решение кода
Прежде всего, проблема с кодом.Отправка результатов до завершения запросов Item.find.Вы можете легко это исправить
var count = docs.length + 1;
next()
_und.each(docs, function(value, key) {
var list = value.toObject();
list.items = [];
Item.find({
'list_id': value._id
}, function(err, docs) {
if (!err) {
_und.each(docs, function(value, key) {
list.items.push(value.toObject());
});
// push asynchronous
results.push(list);
next()
}
else {
console.log(err);
}
});
});
function next() {
--count === 0 && finish()
}
function finish() {
res.send(results)
}
Самый простой способ - это подсчет ссылок, по умолчанию вы рассчитываете количество документов.Затем каждый раз, когда вы заканчиваете получать предмет, вы звоните next
и уменьшаете счет на единицу.
Как только вы закончили получать все предметы, ваш счет должен быть равен нулю.Обратите внимание, что мы делаем .length + 1
и немедленно вызываем next
.Это оправдывает случай, когда нет документов, которые в противном случае ничего бы не делали.
Решение для базы данных
Лучшее решение - правильно использовать монго.Вы не должны делать то, что фактически является соединением в вашем коде, это чертовски медленно и неэффективно.Вы должны иметь вложенный документ и денормализовать свой список.
так что list.items = [Item, Item, ...]
В качестве еще одного исключения, избегайте мангустов, это неэффективно, используйте собственный драйвер монго.