计算Meteor和MongoDB中提交的电子邮件数

计算Meteor和MongoDB中提交的电子邮件数,mongodb,heroku,meteor,meteorite,mongohq,Mongodb,Heroku,Meteor,Meteorite,Mongohq,我刚刚用meteor编写了一个小程序,并使用在Heroku下运行的MongoHQ。这个简单的应用程序将创建一个有多少人提交电子邮件的实时计数。您可以在这里找到示例: 以下是收藏: Counts = new Meteor.Collection("supporters"); 在客户端,我运行: Template.CountWrapper.SupporterCount = function () { return Counts.find().count(); }; Template.Bo

我刚刚用meteor编写了一个小程序,并使用在Heroku下运行的MongoHQ。这个简单的应用程序将创建一个有多少人提交电子邮件的实时计数。您可以在这里找到示例: 以下是收藏:

Counts = new Meteor.Collection("supporters");
在客户端,我运行:

Template.CountWrapper.SupporterCount = function () {
    return  Counts.find().count();
};

Template.BodySupporter.events({
    'click .support-click' : function () {
      if ($("#supportInputName").val() != "") {
        Supporters.insert({name: $("#supportInputName").val()});
        $(".signup-form").fadeOut(600, function() {
          $(".thank-you-message").fadeIn(600);
        });
      }
      return false;
    }
})
问题是,当提交电子邮件的用户数包括在内时,数据库执行计数查询的速度似乎非常慢。有没有更好的方法来处理这个问题?
谢谢。

查看原始DDP套接字可以看出您正在将整个集合发送到客户端,因此实际上每个人都会下载整个“支持者”集合

这看起来有点低效。这是因为您发送了整个集合(约7000条记录,每个记录在DDP连线上看起来约为100字节),总共需要下载近1MB的数据

因此,必须先下载这些数据,然后才能显示计数。为什么不将计数存储在一个单独的集合中,然后只发送下来?那样应该快得多。除非你在一张桌子上或别的什么地方列出了所有的名字,否则最好这样做


另一件事是在你的主机提供商上,你不能让WebSocket工作,所以meteor会退回到长轮询(XHR),这是一个比较慢的初始连接,因为有所有这些额外的开销。您可能想看看介于两者之间的东西,通常是一个未配置为允许通过websocket请求的代理或防火墙。

我完全同意您的看法,即采用这种方式效率非常低。我试图创建另一个只存储计数的集合,但我无法在客户端站点上使用Meteor的update()函数。我刚得到错误的不可信代码。。。对于在服务器端实现这一点,您有什么建议吗。我可以使用pulish()或subscribe等方法在服务器上获取此更新吗?不受信任的代码错误意味着您需要添加允许/拒绝规则,然后使用
\u id
字段进行更新(如果您在客户端上运行)。我建议您使用支持者集合的
插入
删除
。允许
/
。拒绝
规则,这样当您添加新记录时,它会自动增加计数器AKSHAK,我仅为计数器实现了另一个集合。但是,整个Supporter集合仍在下载到客户端。现在我只想在有人将电子邮件输入到输入字段时移动insert()。我是否可以调用insert()调用集合,而无需下载整个集合。是的!你仍然可以这样做。您必须确保不发布该集合,但它仍然可以存在!只是它不会下载任何数据。以防万一,你还没有确定你的流星删除自动发布是。删除自动发布确实有助于减少不必要集合的加载时间。它现在运行得很好,您可以在以下位置看到它:()