2011-07-27 2 views
1

Как вы выполняете «соединение» (я знаю, что это не правильный термин) с массивом сообщений в мангусте?Как вы «присоединяетесь» к массиву в мангусте (mongodb) с node.js?

Я попытался цикл по всем сообщениям и запрашивая, чтобы получить информацию о пользователе, но он не работает:

messages.forEach(function (message, index) { 
    User.findById(message.userId, function (err, user) { 
    messages[index].user = user 
    }) 
}) 

console.log(messages) // the user info is not attatched 

Так как это достигается с мангустов и Node.js?

+0

Вы хотите, чтобы подтолкнуть сообщений вар в новый массив или сделать Implode сообщений? – Awea

ответ

1

самая большая проблема с вашим кодом заключается в том, что вы предполагаете, что код запускается синхронно - но это не так. он работает асинхронно. поэтому сообщения еще не установлен при выполнении

console.log(messages); 

сделать что-то вроде этого, вместо:

var userIds = [id1, id2, id3]; 
User.find({"_id": {$in: userIds}}, function (err, users) { 
    console.log(users); 
}); 

редактировать хорошо, я вижу. вы хотите добавить userInfo в разные сообщения. простой способ добиваться тех это, чтобы использовать модуль асинхронной: https://github.com/caolan/async

async.map(messages, getUserInfo, function (err, result) { 
    if (err) { 
    console.log(err); 
    return; 
    } 
    // log all msg with userinfo 
    console.log(result); 
}); 

function getUserInfo (msg, callback) { 
    User.findById(msg.userId, function (err, user) { 
    if (err) { 
     callback(err); 
     return; 
    } 
    msg.user = user; 
    callback(null, msg); 
    }); 
} 
+0

Да, «$ in» находит список пользователей, которые отправили эти сообщения, но я не могу представить простой способ добавить его в сообщение, чтобы вместо [{message: 'blah', userId: 'dsfsdf' }, ....] это будет [{сообщение: 'blah', user: {user info here}, ....] –

+0

@ парень-парень, не получилось это на первый взгляд. отредактировал мой ответ. – pkyeck

Смежные вопросы