订阅现有收藏品的计数

时间:2013-10-06 10:14:07

标签: javascript mongodb meteor

我需要跟踪一个集合的计数器,其中包含大量不断更新的文档。 (想想一个巨大的日志列表)。我想要做的是让服务器向我发送250k文档的列表。我只想看到一个柜台上升。

我找到了一个非常相似的question here,我也查看了文档中的.observeChanges(),但是再次看来,.observe()以及.observeChanges()实际上< em>返回整个集合,然后跟踪已添加,更改或删除的内容。

在上面的示例中,“添加”函数将针对每个返回的文档触发一次以递增计数器。

对于大型集合来说这是不可接受的 - 我只想跟踪计数的变化,因为我理解.count()绕过了整个文档集的提取。前一个例子涉及仅计算与房间相关的文件,这不是我想要的(或者能够复制并开始工作)

我一定会想念一些简单的东西,我已经被困了几个小时。

非常感谢任何反馈。

2 个答案:

答案 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);
});

将来可能会有一些更高级别的方法。