さまざまなアプローチを検討しました。この問題は、フィールドを慎重に選択し、サブスクリプションの順序を気にすることでケースバイケースで解決できますが、これらのソリューションは薄っぺらで、文書化されていない任意の条件に依存しています。
唯一の実際の一般的なソリューションは仮想コレクションです 。最も単純なケースは、別のクライアント側のコレクション名でカーソルを公開することです。例:
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()