我得到一个显示项目列表的应用程序。 列表是一份文件 项是具有listId的文档 每个项目可能有一个itemImage(使用collectionFs)
在页面上我有一些订阅。其中一些是当前列表的2个计数器,基于db中的项目总数(与显示的项目总数不同)和具有某些特殊状态的项目总数。
当用户删除所有这些项目时,它会向服务器发送Meteor.call('remove', listId)
。
在服务器上,调用的方法不会直接删除项目,而是使用
items.find({listId: listId}).forEach()
在foreach
内,我从itemImage
收藏集中删除了文档
如果有超过1000个项目(开发服务器),那么它会阻止该接口,因为: 显示的计数器实时递减(几乎)。 服务器完成后,将运行所有挂起的订阅。 因此,在此暂挂时间内,用户被阻止。
我试图停止对计数器的订阅,但我没有成功。
也许我的申请很糟糕。 解决办法是什么 ?修改mongoDb(但以哪种方式?)或以其他方式管理订阅?
我仍然希望让计数器具有反应性,因为当mongo中保存了新项目时,这对用户来说是一种更好的感觉。但事实上,当我删除时,它几乎是无用的。 感谢
答案 0 :(得分:1)
是的,这是一个真正的瓶颈。您肯定希望在大型数据库更改期间停止订阅。我在这个答案中描述了一个解决方案:Meteor's subscription and sync are slow
这个想法只是对使用正在更改的集合的模板进行保护,这样您就可以在更新数据库时破坏反应性。
答案 1 :(得分:0)
好的,所以我认为这是对应用程序的误解。
我必须修改应用程序,以便使用Collection.remove({myQuery})直接删除,而不是使用光标在Collection上循环,这将帮助我根据_id执行删除。
如果您不提供回调,则执行循环阻止。也许您可以使用回调来提高性能(即使它什么都不做)。
但是这个解决方案并没有回答我:为什么我在数据库进行大量修改(大量删除)时无法停止订阅。