2011-07-27 12 views
1

マングースのメッセージの配列で「結合」(正しい用語ではないことは分かっています)node.jsでmongoose(mongodb)の配列にどのように "join"するのですか?

私はすべてのメッセージをループし、ユーザーの情報を取得するために照会しようとしたが、動作していません。

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

あなたは新しい配列にメッセージのVARを押したり、メッセージの破を作りたいですか? – Awea

答えて

1

コードの最大の問題は、コードを同期的に実行することを前提としていることです。非同期に実行されます。そのメッセージはまだあなたが

console.log(messages); 

が、この代わりのような何かを実行したときに設定されていません。

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

編集 [OK]を、私は参照してください。 userInfoを別のメッセージに追加します。これをacieveする 最も簡単な方法は、非同期モジュールを使用することです: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' }、....]それは[{メッセージ: 'ああ、ユーザー:{ここのユーザー情報}、....] –

+0

@ guy-guy ok、一見するとこれを取得しませんでした。私の答えを編集しました。 – pkyeck

関連する問題