MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Construire une publication réactive avec des champs supplémentaires dans chaque document

Il est relativement facile de garder des champs privés même s'ils font partie de la requête de la base de données. Le dernier argument de self.added est l'objet transmis au client, vous pouvez donc supprimer/modifier/supprimer les champs que vous envoyez au client.

Voici une version modifiée de votre violon. Cela devrait faire ce que vous demandez. (Pour être honnête, je ne sais pas pourquoi vous aviez quoi que ce soit enchaîné après le observeChanges fonction dans votre violon, alors peut-être que je vous comprends mal, mais en regardant le reste de votre question, cela devrait être le cas. Désolé si je me suis trompé.)

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