2017-02-05 101 views
1

我想做一個出版物,它返回代碼屬性等於用戶selectedGroup的組。流星發佈或訂閱返回一個對象數組時,它應該只返回一個對象

Meteor.publish('selectedGroup', function() { 
    return Groups.findOne({ 
    code: Meteor.users.findOne(this.userId).profile.selectedGroup 
    }) 
}) 

和認購看起來像這樣

Meteor.subscribe('selectedGroup') 
return { 
    group: Groups.find({}).fetch() 
} 

但我得到的是所有的組陣列,該用戶所屬,而不是出版物應該返回該組。

即使當我做findOne()它返回的第一個對象,而不是發佈應該返回的。

+0

還有其他訂閱組合集合嗎? – zim

+0

有但沒有在這個組件。 –

+0

這可能很重要。如果兩個訂閱都處於活動狀態,Meteor將合併已發佈的內容。上面的客戶端find()不執行任何過濾,因此它會顯示發佈到客戶端的所有內容。 – zim

回答

0

首先,你不應該在你的出版物中使用findOne - 出版物應該返回一個遊標;在這種情況下,您將發佈單文檔遊標(只要組中的單個文檔與查詢匹配)。在出版物中只需使用find

其次,當您在客戶端上獲取數據時,應該使您的查詢適當具體。目前您正在提取全部您的客戶訂閱的組(可能您還有其他出版物和訂閱正在運行)。請參閱here瞭解流星指南的建議。你會想要做這樣的事情在你的容器:

return { 
    group: Groups.findOne({ 
    code: Meteor.users.findOne(this.userId).profile.selectedGroup 
    }) 
} 

最後,如果您的用戶selectedGroup可以改變的,你應該知道,該出版物提供的數據可以改變,但他們的查詢不能。因此,如果用戶的selectedGroup發生更改,則發佈不會反映這一點 - 因爲其查詢不會更改。見here。所以你會想用reactive publish package來解決這個問題。

+0

謝謝!這非常有幫助! –