在每个文档中使用附加字段构build被动发布

我想用其他几个字段来创build一个发布,但是我不想使用Collection.aggregate ,当收集发生变化时(因此我不能仅仅使用self.added ),就会丢失发布的更新。

我计划使用Cursor.observeChanges为了实现这一点。 我有两个主要的限制:

  1. 我不想发布所有的文档字段
  2. 我想使用一些未发布的字段来创build新的字段。 例如,我有一个字段item ,我存储的item _id数组。 我不想发布它,但我想发布一个item_count字段与我的字段数组的长度

这里的方法是:

  1. 我打算链查找查询。 我从来没有这样做,所以我想知道是否有可能。 一般(简化)的查询结构将是这样的: http : //jsfiddle.net/Billybobbonnet/1cgrqouj/ (我不能让代码正确显示在这里)

  2. 基于Meteor文档中的计数示例 ,我将查询存储在variableshandle中,以便在客户端取消订阅时停止更改通知:

    self.onStop(function () { handle.stop(); });

  3. 我添加一个标志initializing = true; 在我查询之前,我在调用self.ready();之前将其设置为true self.ready(); 。 我使用这个标志来改变我的itemCountvariables只有当它是初始化的发布。 所以基本上,我改变我的switch那样:

    switch (field) { case "item" if (!initializing) itemCount = raw_document.item.length; break; default: }

我想在对代码进行大的修改之前检查这个方法是否可行。 有人可以证实我是否是正确的路?

即使它们是数据库查询的一部分,保留字段也是相当容易的。 self.added的最后一个参数是传递给客户端的对象,所以你可以self.added /修改/删除发送给客户端的字段。

这里是你的小提琴的修改版本。 这应该做你所要求的。 (说实话,我不确定你为什么在你的小提琴中的observeChangesfunction之后有什么链接,所以也许我误解了你,但是看看你的问题的其余部分应该是这样的,对不起,如果我弄错了。 )

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

要解决你的第一个问题,你需要告诉MongoDB它应该在游标中返回哪些字段。 离开你不想要的领域:

 MyCollection.find({}, {fields: {'a_field':1}}); 

解决你的第二个问题也很简单,我build议使用集合帮助程序包 。 你可以很容易地做到这一点,就像这样:

 // Add calculated fields to MyCollection. MyCollection.helpers({ item_count: function() { return this.items.length; } }); 

这将在对象添加到游标之前运行,并将在返回的对象上dynamic计算,而不是存储在MongoDB中。