2015-09-20 4 views
0

Я пытаюсь запустить поиск внутри другой находки, и я не получаю никаких результатов от второй операции поиска.MongoDB Цикл сортировки

User.find({}, function (err, docs) { 
    for (i = 0; i < docs.length; i++) { 
     var tmp = ''; 

     UserGroups.find({userName: docs[i].userName}, function (errin, groups) { 
      for (g = 0; g < groups.length; g++) { 
       tmp += ", " + groups[g].groupName; 
       //console.log(groups[g].groupName); 
      } 
     }); 

     console.log(tmp); 

     //docs[i].group = that; 
     docs[i].username = decrypt(docs[i].username); 
     docs[i].password = ''; 

    } 
    res.render('users', {users: docs}); 
}); 

ответ

0

Ваш 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 функции в Мангуста «присоединиться» коллекции вместе

+0

Как ??? Я новичок в этом .. Можете ли вы показать мне, пожалуйста? – Itsik

+0

Для заполнения? Вы читали документацию? Я сомневаюсь, что с тех пор, как я опубликовал его 15 секунд назад. Попытайтесь заставить его работать сначала, если у вас возникнут трудности, задайте другой вопрос. – ThrowsException

+0

Не для заполнения ... Только для кода, который я написал – Itsik