0

投稿用のJSONAPIを提供しています。ここでは、投稿オブジェクトを適切なユーザーモデルにリンクした後に配信したいと考えています。

私は次のようなMongoDBスキーマを持っています:

User = {
    email: String,
    password: String
};

Post = {
    user: ObjectId,
    text: String
};

次のコードを使用して行った単一の投稿のリンクに問題はありません(私はMongooseとExpressを使用しています)。

app.get('/api/posts/:id', function(req, res){
  return Post.findById(req.params.id, function(err, post) {
    if (!err) {
        User.findById(post.user, function(err, user){

            var joinedpost = {
                text : post.text,
                user : user
            };
          return res.send(joinedpost);      
        });
     }
  });
});

ただし、複数の投稿をサーバーに保存する場合、次の問題が発生します。非同期環境で作業しているため、すべての投稿を取得して繰り返し処理し、各投稿をユーザーにリンクすることはできません。

したがって、2つのクエリを作成する必要があると思います。1つは投稿をフェッチし、もう1つはそれらを一度にリンクして、すぐに提供できるようにします。私は正しいですか?もしそうなら、どうすればそれを達成できますか?

4

1 に答える 1

1

$inオペレーターは、これを1つのクエリで実行できるようにします。これが私がそれを行う方法です(あなたがアンダースコアを使用すると仮定して):

app.get('/api/posts', function(req, res){
  return Post.find(function(err, posts) {
    if (!err) {
      var userIds = _.pluck(posts, user);
      User.find({"id": {"$in": userIds}}, function(err, users){
        var map = {};
        _.each(users, function(u){
          map[u.id] = u;
        });
        _.each(posts, function(p){
          p.user = map[p.user];
        });
        return res.send(posts);
      });
    });
   }
});

これは十分にテストされていないため、User.find呼び出しでエラー状態を処理する必要がありますが、これは適切な開始点になるはずです。

また、asyncライブラリはこのようなもので大いに役立ちます。waterfallあなたはそれと、クレイジーなネストされたコールバックの問題を回避するためのメソッドのようなものを調べるかもしれません。

于 2012-07-19T05:15:00.367 に答える