2015-05-21 44 views
0

我有一個Mongo集合的項目(項目)。我有另一個與項目相關的權限集合(item_ownership),其中一個權限存儲擁有項目的用戶的標識(owner_id)。我想獲取用戶擁有的所有項目併發布它們。 因此,理論上,我想先從'item_ownership'集合中選擇item_id,然後將其插入'items'集合的查詢中以對其進行過濾。這個過濾結果集將發佈到瀏覽器:減少流星發送給瀏覽器的Mongo記錄數量?

Items = new Mongo.Collection("items"); 
ItemOwnership = new Mongo.Collection("item_ownership"); 

Meteor.publish('items_pub', function() { 

     var itemOwnershipColl = ItemOwnership.find(
      { 
       owner_id: Meteor.userId() 
      }, 
      { 
       fields: { item_id: 1 } 
      } 
     ); 

     // Compile list of items to return. 
     var item_id_array = []; 
     itemOwnershipColl.forEach(function (record) { 
      item_id_array[item_id_array.length] = record.item_id; 
     }); 

     return Items.find(
      { 
       item_id: { $in: item_id_array } 
      }, 
      { 
       sort: { 
        item_order: 1 
       } 
      } 
     ); 
}); 

這是最好的方式去做這件事嗎?

回答

1

如果我正確理解您的模式,看起來您的連接似乎是正確的。下面就來寫一個方法:

Meteor.publish('items_pub', function() { 
    var selector = {owner_id: this.userId}; 
    var items = ItemOwnership.find(selector, {fields: {item_id: 1}}).fetch(); 
    var itemIds = _.pluck(items, '_id'); 
    return Items.find({_id: {$in: itemIds}}); 
}); 

它基本上是同樣的事情,你的代碼有一些快捷方式的更正:

  • 你失蹤的初始查找之後fetch。沒有它,你將無法訪問文檔。
  • _.pluck是一種將ID提取到數組中的更簡單的方法。
  • 在發佈中排序不是有用的,除非它與limitskip結合使用。見common mistakes
  • 我假設你的意思是在上次查找中搜索_id而不是item_id

同樣值得注意的是,使用mongodb時,這種連接集合(ItemOwnership)通常是不必要的。一個更好的解決方案可能是在用戶上存儲一系列項目,或者在項目上存儲用戶數組。

+0

使用此方法(以及問題的原始方法)將導致非反應性連接。我通過使用Michael Floyd建議的軟件包解決了我的問題。 – JoeTidee