2015-04-19 63 views
0

流星集合'客戶'是收集'項目'的父母 項目中的外鍵是'client_id'。流星集合變換檢查其他集合,奇怪的行爲

現在我想讓客戶名稱擴展Projects集合。如果沒有Client-parent,則將客戶名稱設爲'XXX'。 (易見 '孤兒' 項目:只要看看那些XXX爲客戶名稱)

流星代碼如下:

collections.js

Client = new Mongo.Collection('clients'); 

Project = new Mongo.Collection('projects', { 
     transform: function (doc) { 

      var client = Client.findOne({"_id":doc.client_id},{"_id":0, "name":1}); 
      if (!client) { 
       // Client name is 'XXX' 
       return _.extend(doc, {"client_name":"XXX"}); 
      } else { 
       return _.extend(doc, {"client_name":client.name}); 
      } 

     } 
    } 
); 

publications.js

Meteor.publish('clientNewYork', function() { 
    // This publication only New York clients, and only the name. 
    return Client.find({"city":"New York"}, {fields: {"name": 1}}, {sort: name: -1}); 
}); 
Meteor.publish('projects', function() { 
    return Project.find(); 
}); 

蘇bscriptions.js

Meteor.subscribe('clientNewYork'); 
Meteor.subscribe('projects'); 

應用開始於第一次訂閱:在紐約的所有客戶機的列表。 下一個屏幕是所有項目,充實客戶名稱。 重要提示:所有項目,不僅來自紐約客戶。

奇怪的事情發生了:

不在紐約所有客戶的項目獲得「XXX」作爲客戶端名稱。 這意味着在收集的變換中會考慮到該出版物。

我懷疑:

非紐約的客戶只是沒有在MiniMongo在我的瀏覽器。 但我期望collection.js會轉到服務器上運行的數據庫,而不是瀏覽器上的minimongo。

解決方法:

更改客戶端pubication到所有客戶端,而不是隻有紐約的。 但我的感覺說這不好。

我在這裏做錯了什麼?

回答

0

無論何時讀取文檔,轉換都在文檔上運行。您的懷疑是正確的:

當在客戶端上獲取項目文檔時,它們每個都查找相應的客戶端文檔。因爲客戶端上的find會觸及minimongo,所以只有已發佈的客戶端(在您的情況下是NYC客戶端)纔會匹配。

不知道更多關於您的實施細節,很難提出精確的解決方案。一些選項包括:

  1. 通過存儲該項目的client_name場進行非標準化的數據(避免轉換)。缺點是,無論何時更新客戶名稱,您都需要更新相應的項目。看看collection-hooks

  2. 爲客戶提供更靈活的發佈功能。如果您可以識別當前項目或當前的一組項目,則可以在訂閱時將ID或ID數組傳遞給發佈功能。通過這種方式,您仍然可以加入這兩個集合而無需發佈整套客戶端文檔。