【问题标题】:meteor server side bulk database changes流星服务器端批量数据库更改
【发布时间】:2013-10-13 22:09:01
【问题描述】:

meteor 有什么方法可以在服务器端对已发布的集合进行批量更改?...比如更新/插入数百或数千条记录,而不将每条记录一一发送给所有订阅者?

我定期提取第三方数据,只想将所有更新或插入作为一批更新一次拉取,以便所有客户将其作为一个更改包接收,而不是数千个小型更新。一个一个地做会在我的应用 atm 中造成很大的瓶颈。

如果流星不支持此 atm,那么我是否应该直接对 mongo 进行更新并让流星在下一次 mongo 民意调查中获取它?

// imagine myChanges array with 1000 items
myChanges.forEach(function(change){
    // this will trigger the sync with clients immediately... 1000 times
    // currently this will practically hang my server
    // i want to gather the changes here instead
    MyCollection.update({_id: change.docId}, change);
});

// and trigger the sync here instead

谢谢, 雷欧

【问题讨论】:

  • 您是否有任何代码/示例来描述该问题? Meteor 已经只将差异发送给客户端。与您要发布的所有数据进行初始同步,然后在您编辑数据时对客户端进行任何更改(仅限差异)。
  • diff 对我没有帮助,因为这些是真正的变化,文档正在发生变化,因此必须将它们发送给客户。问题是它们是一一发送的。例如,如果我使用某种 foreach 或循环在服务器端更改 100 个文档,那么每个循环周期将立即触发将更改发送给客户端。我想要的是保持发送直到循环完成并触发“刷新”以发送包含此循环期间完成的所有更改的批处理更新。
  • 我看到客户端在 minimongo 中有类似的未记录功能:beginUpdate()endUpdate().pauseObservers().resumeObservers(),但在服务器端找不到任何东西

标签: meteor


【解决方案1】:

根据您的应用程序有多复杂,或者您有多少发布调用,这可以通过滚动您自己的发布函数来实现。

即而不是

Meteor.publish("myCollection", function() {
    return myCollection.find(); } );

创建您自己的发布/游标并为其添加挂钩。

Meteor.publish("myCollection", function() {
    globalObserver = myCollection.find().observe({
        added: function(item) {
            publication.added(item);
        }
        // And So on
     });

然后,您的批量更新将需要以某种方式与此发布函数进行交互,导致它在您的更新完成后停止并重新初始化观察者。

【讨论】:

    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2015-06-24
    相关资源
    最近更新 更多