Ваш UserGroups.find
будет выполняться асинхронно поэтому console.log(tmp)
собирается запустить перед вашим UserGroups.find
имеет шанс закончить и ваш звонок будет вернуться, прежде чем получить какие-либо результаты. Если вам нужны результаты UserGroup.find
, вам нужно переместить всю вашу логику в этот обратный вызов.
EDIT
Это я считаю, гораздо лучше, подход с точки зрения предсказуемости и производительности запросов. Ваш предыдущий подход: UserGroup.find
, который вызывается n раз. N - количество пользователей в вашей базе данных. При таком подходе база данных запрашивается только дважды. Однажды, чтобы получить всех пользователей и второй, чтобы получить все группы.
User.find({}, function (err, docs) {
//Get all the usernames before executing the UserGroups query
var userNames = [];
users.forEach(function(element) {
userNames.push(element.userName);
});
UserGroups.find({userName: {$in : userNames}}, function (errin, groups) {
for (var i = 0; i < docs.length; i++) {
//get all the groups that belong to this user
var userGroups = groups.filter(function(value) {
return value.userName === docs[i].userName;
});
var tmp = "";
userGroups.forEach(function(element){
tmp += "," + element.groupName
});
//docs[i].group = that;
docs[i].username = decrypt(user[i].username);
docs[i].password = '';
}
res.render('users', {users: docs});
});
});
Кроме того, поскольку в этом случае вы используете Мангуст вы можете использовать встроенный в populate функции в Мангуста «присоединиться» коллекции вместе
Как ??? Я новичок в этом .. Можете ли вы показать мне, пожалуйста? – Itsik
Для заполнения? Вы читали документацию? Я сомневаюсь, что с тех пор, как я опубликовал его 15 секунд назад. Попытайтесь заставить его работать сначала, если у вас возникнут трудности, задайте другой вопрос. – ThrowsException
Не для заполнения ... Только для кода, который я написал – Itsik