在每个文档中使用附加字段构build被动发布
我想用其他几个字段来创build一个发布,但是我不想使用Collection.aggregate
,当收集发生变化时(因此我不能仅仅使用self.added
),就会丢失发布的更新。
我计划使用Cursor.observeChanges
为了实现这一点。 我有两个主要的限制:
- 我不想发布所有的文档字段
- 我想使用一些未发布的字段来创build新的字段。 例如,我有一个字段
item
,我存储的item
_id数组。 我不想发布它,但我想发布一个item_count
字段与我的字段数组的长度
这里的方法是:
-
我打算链查找查询。 我从来没有这样做,所以我想知道是否有可能。 一般(简化)的查询结构将是这样的: http : //jsfiddle.net/Billybobbonnet/1cgrqouj/ (我不能让代码正确显示在这里)
-
基于Meteor文档中的计数示例 ,我将查询存储在variables
handle
中,以便在客户端取消订阅时停止更改通知:self.onStop(function () { handle.stop(); });
-
我添加一个标志
initializing = true;
在我查询之前,我在调用self.ready();
之前将其设置为true
self.ready();
。 我使用这个标志来改变我的itemCount
variables只有当它是初始化的发布。 所以基本上,我改变我的switch
那样:switch (field) { case "item" if (!initializing) itemCount = raw_document.item.length; break; default: }
我想在对代码进行大的修改之前检查这个方法是否可行。 有人可以证实我是否是正确的路?
即使它们是数据库查询的一部分,保留字段也是相当容易的。 self.added
的最后一个参数是传递给客户端的对象,所以你可以self.added
/修改/删除发送给客户端的字段。
这里是你的小提琴的修改版本。 这应该做你所要求的。 (说实话,我不确定你为什么在你的小提琴中的observeChanges
function之后有什么链接,所以也许我误解了你,但是看看你的问题的其余部分应该是这样的,对不起,如果我弄错了。 )
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中。