2015-10-19 56 views
0

我有這樣一個集合中的元素的2個不同的預測:流星:發佈數組元素

{ 
    array: [{ a:10, b: {...} }, { a:30, b: {...} }, { a:50 b: {...} }] 
} 

在一個刊物,可以返回幾百個結果,我投影陣列 只擁有a現場,更輕:

return Col.find({}, { fields: { 'array.a': 1 } }) 

在一個又一個,我發佈一個完整的文檔:

return Col.find({ _id: ObjectId(...) }) 

第二次發佈缺少從第一次發佈的 中的每個陣列項目排除的字段,有時爲。刷新頁面(可能更改 訂閱的順序?)修復了該錯誤。

如何在我的大型出版物中發佈縮小的數組項目以及單個出版物中的完整 元素?

+1

這似乎是[這個問題]的副本(https://stackoverflow.com/questions/ 28969223/one-publication-is-hiding-nested-fields-from-another-publication) - 你同意嗎? –

+0

It _could be_。我不確定:不同之處在於,我在使用內部數組元素字段,這可能會有不同的合併策略。我想保持這個問題分開,而我調查 – slezica

+0

是的,我不知道你的問題是否使用子字段。基本上任何時候你投射一個給定字段的子集(數組,子文檔等),你都可能會發生這樣的衝突。 –

回答

1

我檢查了不同的方法。這個問題可以通過仔細挑選字段和遵守訂閱順序來逐個解決,但這些解決方案是脆弱的,並且依賴於未記錄的任意條件。

唯一真正的通用解決方案是虛擬集合。最簡單的情況是簡單地在不同的客戶端集合名稱下發布遊標。例如:

function publishVirtual(sub, name, cursor) { 
    var observer = cursor.observeChanges({ 
    added : function(id, fields) { sub.added(name, id, fields) }, 
    changed: function(id, fields) { sub.changed(name, id, fields) }, 
    removed: function(id)   { sub.remove(name, id) } 
    }) 

    sub.onStop(function() { 
    observer.stop() // important. Otherwise, it keeps running forever 
    }) 
} 

那麼,在您的出版物,而不是返回並有cursor

var cursor = Users.find() 
publishVirtual(this, 'virtualUsers', cursor) 
this.ready()