2016-01-12 77 views
3

這是我的重點:用戶可以訪問不同的聊天室。當他們這樣做時,如果ID尚未被添加,我將聊天室ID推入客戶端的反應陣列中。如果沒有,我重新運行一個自動運行程序,該程序將訂閱客戶在本次會話中訪問的每個聊天室的最後50條消息。Meteor.js返回多個遊標

但我希望他能夠只接收每個聊天室的最後50條消息!

以前我有:

Meteor.publish("getChatMess", function(cids) { 
    if (!Array.isArray(cids)) 
     cids = [cids]; 

    return (ChatMess.find({ chatId: cids[i] }, { sort: { date: -1 }, limit: (75 * cids.length) })); 
}); 

這顯然不適合我的需要,所以我這樣做:

Meteor.publish("getChatMess", function(cids) { 
    if (!Array.isArray(cids)) 
     cids = [cids]; 


    let i = -1, 
     cursors = []; 

    while (cids[++i]) 
    { 
     cursors.push(ChatMess.find({ chatId: cids[i] }, { sort: { date: -1 }, limit: 50 })); 
    } 

    return (cursors); 
}); 

但是,流星把我的錯誤,因爲我不能回來自同一集合中的幾個光標在單個推文中。

我該如何解決這個問題?我知道我可以檢查每次聊天,選擇每個聊天的最後50條消息(或更少)的ID,並查詢chatMess集合中的所有相應ID,但是對於我想要的,它會很沉重並且未優化,特別是如果客戶已經在會議中訪問了數十個聊天室。

回答

2

,如果你在一個數組返回多個遊標meteor docs

表示,他們目前都必須從不同的收藏 。我們希望在未來的版本中解除這個限制 。

但是有一個名爲smart-publish的軟件包,可以幫助您管理同一個集合中的多個遊標。這可能有幫助https://atmospherejs.com/mrt/smart-publish

+0

這樣的恥辱我甚至沒有想過去檢查氣氛......謝謝! :) –

+0

@DavidPanart不客氣。 :) – tkay