【问题标题】:Remove lot of item from db : subscription blocks the client从数据库中删除大量项目:订阅阻止客户端
【发布时间】:2013-12-24 00:05:40
【问题描述】:

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

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

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

循环遍历列表
items.find({listId: listId}).forEach()

foreach 中,我从itemImage Collections 中删除文档

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

我尝试停止柜台订阅,但没有成功。

也许我的申请被错误地考虑了。 解决办法是什么 ?修改 mongoDb(但以哪种方式?)或以另一种方式管理订阅?

我仍然想让计数器反应,因为当 mongo 中保存了新项目时,这对用户来说感觉更好。但实际上,当我删除时,它几乎没用。 谢谢

【问题讨论】:

  • 您能否将item id 放在每个itemImage 文档上,这样您就可以通过单个查询删除itemImages 吗?
  • 我的 itemImage 已经有 itemId,在 forEach 中我使用 itemId 删除 itemImage,但如果我可以通过 listId 上的全局查询删除图像,我无法使用 itemImage。

标签: meteor


【解决方案1】:

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

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

【讨论】:

  • 首先我会尝试在 itemImage 的元数据中添加 listId 来测试全局删除查询。如果它不起作用,我会看看这个解决方案,谢谢,找到解决方案后我会发帖
【解决方案2】:

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

我必须修改应用程序,使其更喜欢使用 Collection.remove({myQuery}) 直接删除,而不是使用游标对 Collection 进行循环,这将帮助我根据 _id 进行删除。

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

但是这个解决方案没有回答我:为什么当数据库有大量修改(大量删除)时我不能停止订阅。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2020-06-15
    • 2020-11-21
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2021-10-20
    • 2019-07-24
    相关资源
    最近更新 更多