从db:subscription中删除大量项目阻止客户端

时间:2013-12-18 17:39:50

标签: meteor

我得到一个显示项目列表的应用程序。 列表是一份文件 项是具有listId的文档 每个项目可能有一个itemImage(使用collectionFs)

在页面上我有一些订阅。其中一些是当前列表的2个计数器,基于db中的项目总数(与显示的项目总数不同)和具有某些特殊状态的项目总数。

当用户删除所有这些项目时,它会向服务器发送Meteor.call('remove', listId)。 在服务器上,调用的方法不会直接删除项目,而是使用

在列表上循环
items.find({listId: listId}).forEach()

foreach内,我从itemImage收藏集中删除了文档

如果有超过1000个项目(开发服务器),那么它会阻止该接口,因为: 显示的计数器实时递减(几乎)。 服务器完成后,将运行所有挂起的订阅。 因此,在此暂挂时间内,用户被阻止。

我试图停止对计数器的订阅,但我没有成功。

也许我的申请很糟糕。 解决办法是什么 ?修改mongoDb(但以哪种方式?)或以其他方式管理订阅?

我仍然希望让计数器具有反应性,因为当mongo中保存了新项目时,这对用户来说是一种更好的感觉。但事实上,当我删除时,它几乎是无用的。 感谢

2 个答案:

答案 0 :(得分:1)

是的,这是一个真正的瓶颈。您肯定希望在大型数据库更改期间停止订阅。我在这个答案中描述了一个解决方案:Meteor's subscription and sync are slow

这个想法只是对使用正在更改的集合的模板进行保护,这样您就可以在更新数据库时破坏反应性。

答案 1 :(得分:0)

好的,所以我认为这是对应用程序的误解。

我必须修改应用程序,以便使用Collection.remove({myQuery})直接删除,而不是使用光标在Collection上循环,这将帮助我根据_id执行删除。

如果您不提供回调,则执行循环阻止。也许您可以使用回调来提高性能(即使它什么都不做)。

但是这个解决方案并没有回答我:为什么我在数据库进行大量修改(大量删除)时无法停止订阅。