sql >> Base de Datos >  >> NoSQL >> MongoDB

Cree una publicación reactiva con campos adicionales en cada documento

Es relativamente fácil mantener los campos privados incluso si son parte de la consulta de la base de datos. El último argumento de self.added es el objeto que se pasa al cliente, por lo que puede eliminar/modificar/eliminar los campos que está enviando al cliente.

Aquí hay una versión modificada de su violín. Esto debería hacer lo que estás pidiendo. (Para ser honesto, no estoy seguro de por qué tenía algo encadenado después de observeChanges función en su violín, así que tal vez no lo esté entendiendo, pero mirando el resto de su pregunta, debería ser así. Lo siento si me equivoqué).

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