【问题标题】:Count email submit in Meteor and MongoDB在 Meteor 和 MongoDB 中计算电子邮件提交
【发布时间】:2013-10-05 03:55:12
【问题描述】:

我刚刚在流星中编写了一个小程序,并使用在 Heroku 下运行的 MongoHQ。这个简单的应用程序将实时统计提交电子邮件的人数。您可以在此处找到示例:DearJJAbrams 以下是合集:

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

问题是当用户提交他们的电子邮件包含数量时,数据库似乎执行计数查询非常慢。有没有更好的方法来处理这个? 谢谢。

【问题讨论】:

    标签: mongodb heroku meteor meteorite mongohq


    【解决方案1】:

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

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

    所以必须先下载这些,然后才能显示计数。为什么不将计数存储在单独的集合中并仅将其发送下来?这样应该快得多。除非您在表格或某处提供完整的姓名列表,否则这样做可能会更好。

    另一件事是在您的托管服务提供商上,您没有让 websockets 工作,因此流星回退到长轮询 (XHR),这在初始连接时会有点慢,因为所有这些额外的开销。您可能想查看介于两者之间的东西,通常是未配置为允许 websocket 请求通过的代理或防火墙。

    【讨论】:

    • 我完全同意你的看法,实现这种方式效率非常低。我尝试创建另一个仅存储计数的集合,但我无法在客户端站点meteor update 上使用 Meteor 的 update() 函数。我刚刚收到错误不受信任的代码...您对在服务器端实现此有任何建议吗?我可以使用任何方法如 pulish() 或订阅在服务器上获取此更新吗?
    • 不受信任的代码错误意味着您需要添加允许/拒绝规则,然后使用_id字段进行更新(如果您在客户端上运行它)。我建议您使用支持者集合的 insertremove .allow/.deny 规则,这样当您添加新记录时,它会自动增加计数器
    • Akshak,我已经为计数器实现了另一个集合。但是,支持者的整个集合仍在下载到客户端。现在我只想在有人将他们的电子邮件输入到输入字段时移动 insert() 。无论如何我可以在不下载整个集合的情况下调用集合的 insert()。
    • 是的!你仍然可以这样做。您必须确保不发布该集合,但它仍然可以存在!只是它不会下载任何数据。以防万一你也不确定meteor remove autopublish
    • 是的。删除自动发布确实有助于减少不必要的集合的加载时间。它现在工作得很好,你可以看到它:(dearjjabrams.com)
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多