Jag undersökte olika tillvägagångssätt. Problemet kan lösas från fall till fall genom att noggrant välja fält och ta hänsyn till prenumerationsordningen, men dessa lösningar är tunniga och förlitar sig på icke-dokumenterade godtyckliga förhållanden.
Den enda riktiga, generiska lösningen är en virtuell samling . Det enklaste fallet är helt enkelt att publicera en markör under ett annat samlingsnamn på klientsidan. Till exempel:
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
})
}
Och sedan, i din publikation, istället för att returnera en cursor
:
var cursor = Users.find()
publishVirtual(this, 'virtualUsers', cursor)
this.ready()