我需要跟踪一个集合的计数器,其中包含大量不断更新的文档。 (想想一个巨大的日志列表)。我不想要做的是让服务器向我发送250k文档的列表。我只想看到一个柜台上升。
我找到了一个非常相似的question here,我也查看了文档中的.observeChanges(),但是再次看来,.observe()以及.observeChanges()实际上< em>返回整个集合,然后跟踪已添加,更改或删除的内容。
在上面的示例中,“添加”函数将针对每个返回的文档触发一次以递增计数器。
对于大型集合来说这是不可接受的 - 我只想跟踪计数的变化,因为我理解.count()绕过了整个文档集的提取。前一个例子涉及仅计算与房间相关的文件,这不是我想要的(或者能够复制并开始工作)
我一定会想念一些简单的东西,我已经被困了几个小时。
非常感谢任何反馈。
答案 0 :(得分:1)
您可以使用Arunoda的meteor-streams智能包完成此操作。它允许你在不需要数据库的情况下做pub / sub,所以你可以发送的一件事就是一个被动号码。例如。
或者,如果你有许多你需要计算的东西或类似的东西,这稍微有点hacky但很有用,你可以有一个单独的“Statistics”集合(无论如何命名)和一个包含该计数的文档
答案 1 :(得分:1)
documentation中有一个关于此用例的示例。我已将其修改为您的特定问题:
// server: publish the current size of a collection
Meteor.publish("nbLogs", function () {
var self = this;
var count = 0;
var initializing = true;
var handle = Messages.find({}).observeChanges({
added: function (id) {
count++;
if (!initializing)
self.changed("counts", roomId, {nbLogs: count});
},
removed: function (id) {
count--;
self.changed("counts", roomId, {nbLogs: count});
}
// don't care about moved or changed
});
// Observe only returns after the initial added callbacks have
// run. Now return an initial value and mark the subscription
// as ready.
initializing = false;
self.added("counts", roomId, {nbLogs: count});
self.ready();
// Stop observing the cursor when client unsubs.
// Stopping a subscription automatically takes
// care of sending the client any removed messages.
self.onStop(function () {
handle.stop();
});
});
// client: declare collection to hold count object
Counts = new Meteor.Collection("counts");
// client: subscribe to the count for the current room
Meteor.subscribe("nbLogs");
// client: use the new collection
Deps.autorun(function() {
console.log("nbLogs: " + Counts.findOne().nbLogs);
});
将来可能会有一些更高级别的方法。