MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Erstellen Sie eine reaktive Publikation mit zusätzlichen Feldern in jedem Dokument

Es ist relativ einfach, Felder privat zu halten, selbst wenn sie Teil der Datenbankabfrage sind. Das letzte Argument für self.added ist das Objekt, das an den Client übergeben wird, sodass Sie Felder entfernen/ändern/löschen können, die Sie an den Client senden.

Hier ist eine modifizierte Version Ihrer Geige. Dies sollte das tun, wonach Sie fragen. (Um ehrlich zu sein, bin ich mir nicht sicher, warum Sie irgendetwas nach observeChanges verkettet haben Funktion in Ihrer Geige, also verstehe ich Sie vielleicht falsch, aber wenn Sie sich den Rest Ihrer Frage ansehen, sollte dies der Fall sein. Tut mir leid, wenn ich mich geirrt habe.)

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