2012-07-19 32 views
0

我服JSON API上崗,在這裏我想將它鏈接到相應的用戶模型後交付後對象的許多文件。的MongoDB - 鏈接一次

我有一個MongoDB的模式是這樣的:

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

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

我沒有找到使用下面的代碼(我使用的貓鼬和快遞聯單後,我做了一個問題):

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);  
     }); 
    } 
    }); 
}); 

然而,當我想服務器的多個帖子中,我面臨着以下問題:由於我在異步環境中工作,我不能簡單地獲取全部信息,並且在它們之間迭代到每個崗位鏈接它的用戶。

所以我覺得我應該寫兩個查詢,一個取的職位,而其他環節他們都在一次,這樣我就可以馬上爲他們服務。我對麼?如果是這樣,我該如何實現呢?

回答

1

$in運營商將讓你在一個查詢做到這一點。以下是我會做它(假設你使用下劃線):

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方法來解決瘋狂的嵌套回調問題。

+0

太感謝你了,這正是我一直在尋找:) – 2012-07-19 06:59:37

+0

你提到運作良好時,我有一個簡單的個案的手法。然而,當我有一個帶有幾個評論的發佈模型時,每個評論都有一個用戶,事情真的變得很複雜。 (你可以在這裏https://github.com/wikitechie/microcommunity/blob/master/app.js#L268看看)。人們通常以這種方式使用MongoDB嗎? – 2012-07-19 14:19:45

+1

是的,人們做了很多。基本上,這只是應用程序邊連接。節點使事情更復雜,因爲它是大量的回調,這就是爲什麼異步庫派上用場。 – MrKurt 2012-07-19 15:22:47