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

Crea una pubblicazione reattiva con campi aggiuntivi in ​​ogni documento

È relativamente facile mantenere i campi privati ​​anche se fanno parte della query del database. L'ultimo argomento di self.added è l'oggetto che viene passato al client, quindi puoi rimuovere/modificare/eliminare i campi che stai inviando al client.

Ecco una versione modificata del tuo violino. Questo dovrebbe fare quello che stai chiedendo. (Ad essere onesti, non sono sicuro del motivo per cui avevi qualcosa incatenato dopo observeChanges funzione nel tuo violino, quindi forse ti sto fraintendendo, ma guardando il resto della tua domanda dovrebbe essere così. Scusa se ho sbagliato.)

var self = this;

// Modify the document we are sending to the client.
function filter(doc) {
  var length = doc.item.length;

  // White list the fields you want to publish.
  var docToPublish = _.pick(doc, [
      'someOtherField'
  ]);

  // Add your custom fields.
  docToPublish.itemLength = length;

  return docToPublish;                        
}

var handle = myCollection.find({}, {fields: {item:1, someOtherField:1}})
            // Use observe since it gives us the the old and new document when something is changing. 
            // If this becomes a performance issue then consider using observeChanges, 
            // but its usually a lot simpler to use observe in cases like this.
            .observe({
                added: function(doc) {
                    self.added("myCollection", doc._id, filter(doc));
                },
                changed: function(newDocument, oldDocument)
                    // When the item count is changing, send update to client.
                    if (newDocument.item.length !== oldDocument.item.length)
                        self.changed("myCollection", newDocument._id, filter(newDocument));
                },
                removed: function(doc) {
                    self.removed("myCollection", doc._id);                    
                });

self.ready();

self.onStop(function () {
  handle.stop();
});