MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Meteor:pubblica 2 diverse proiezioni di elementi dell'array

Ho esaminato diversi approcci. Il problema può essere risolto caso per caso selezionando con cura i campi e tenendo conto dell'ordine di sottoscrizione, ma queste soluzioni sono fragili e si basano su condizioni arbitrarie non documentate.

L'unica vera soluzione generica è una raccolta virtuale . Il caso più semplice consiste semplicemente nella pubblicazione di un cursore con un nome di raccolta lato client diverso. Ad esempio:

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
  })
}

E poi, nella tua pubblicazione, invece di restituire un cursor :

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