MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Crie uma publicação reativa com campos adicionais em cada documento


É relativamente fácil manter os campos privados, mesmo que façam parte da consulta do banco de dados. O último argumento para self.added é o objeto que está sendo passado para o cliente, então você pode remover/modificar/excluir os campos que está enviando para o cliente.

Aqui está uma versão modificada do seu violino. Isso deve fazer o que você está pedindo. (Para ser honesto, não sei por que você tinha algo encadeado após o observeChanges function no seu violino, então talvez eu esteja entendendo mal, mas olhando para o resto da sua pergunta, deve ser isso. Desculpe se eu entendi errado.)
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();
});