2

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

我在这里发现了一个非常相似的问题,并且我还查看了文档中的.observeChanges()但再一次,似乎 .observe() 和 .observeChanges() 实际上在跟踪之前返回了整个集合添加、更改或删除。

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

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

我必须错过一些简单的东西,我已经被难住了几个小时。

非常感谢任何反馈。

4

2 回答 2

1

您可以使用Arunoda的meteor-streams智能包来完成此操作。它可以让您在不需要数据库的情况下进行发布/订阅,因此您可以发送的一件事就是一个反应号码,例如。

或者,如果你有许多需要计算的东西或类似的东西,这会稍微有点hacky但很有用,你可以有一个单独的“统计”集合(随便命名),其中包含一个包含该计数的文档。

于 2013-10-06T10:32:49.570 回答
1

有关此用例的文档中有一个示例。我已将其修改为您的特定问题:

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

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

于 2013-10-06T15:51:17.513 回答