Meteor服务器端批量数据库更改

3
在Meteor中,是否有一种方法可以在服务器端对发布的集合进行批量更改?例如,在不将每个单独的记录逐一发送给所有订阅者的情况下,更新/插入数百或数千条记录?
我定期拉取第三方数据,并希望将所有更新或插入作为一个批量更新收集起来,以便所有客户端都能将其作为一个更改包而不是成千上万个小型更新接收到。逐一执行会在我的应用程序中创建一个大瓶颈。
如果Meteor目前不支持此功能,那么我应该直接对Mongo进行更新,然后让Meteor在下一次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

感谢您的来信,Reio。

1
你有没有任何代码/示例来描述这个问题?Meteor已经只向客户端发送差异。在您编辑数据时,首先进行所有要发布的数据的初始同步,然后是任何更改(仅限差异)发送到客户端。 - Tarang
Relevant - 1321941
diff 对我没有帮助,因为这些是真正的更改,文档正在变化,所以必须将它们发送给客户端。问题在于它们一个接一个地被发送。例如,如果我使用某种 foreach 或循环在服务器端更改了 100 个文档,那么每个循环周期都会立即触发将更改发送到客户端。我想要的是在循环完成之前暂停发送,并触发“刷新”以发送包含此循环期间完成的所有更改的批量更新。 - hypno2000
我看到在客户端中,minimongo 中有类似的未记录功能:beginUpdate()endUpdate().pauseObservers().resumeObservers(),但是在服务器端找不到任何东西。 - hypno2000
1个回答

0
根据您的应用程序的复杂程度或发布调用的数量,可以通过编写自己的发布函数来实现此目标。
例如,不是使用默认的发布函数

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

创建您自己的发布/光标,并添加钩子。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接