データベースクエリの一部であっても、フィールドをプライベートに保つのは比較的簡単です。 self.added
の最後の引数 はクライアントに渡されるオブジェクトであるため、クライアントに送信するフィールドを削除/変更/削除できます。
これがあなたのフィドルの修正版です。これはあなたが求めていることをするはずです。 (正直なところ、observeChanges
の後に何かが連鎖している理由はわかりません あなたのフィドルで機能するので、私はあなたを誤解しているかもしれませんが、あなたの質問の残りを見ると、これはそれであるはずです。間違えたらごめんなさい。)
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();
});