重命名集合与更新集合
rename collection vs updating collection
我有一个 mongo 数据库,我需要每天更新它(删除不相关的文档并添加新的文档)。
数据库未分片。
我从一个不太好用的外部数据主机中获取数据。
有2个选项:
1. 将整个数据库(不是很大)重新摄取到临时集合中,然后将其重命名为旧集合名称(dropTarget 设置为 true)
2.自己动手,删除旧的entires,从data master中找出哪些新文档是相关的,并将它们插入到DB
选项1显然是可取的,但有什么影响?我在很晚的时候进行维护,但我不希望用户在重命名过程中查询数据库时出错。
使用重命名覆盖集合是完成任务的标准方法还是我在滥用 API? :)
根据 documentation renameCollection
在操作期间阻止所有数据库 activity。如果您的用户设置了足够长的超时时间,他们将不会直接受到此重命名操作的影响,但是,由于数据集可能会在他们脚下发生变化,因此可能会产生副作用。例如,重命名集合会使打开的游标无效,从而中断当前正在返回数据的查询。
关于在生产中重命名集合,我个人会尽可能避免这种情况,首先是因为上面的游标问题,但更重要的是因为不完整的 renameCollection
操作会使目标集合处于不可用状态并且需要人工干预清理。相反,我会使用 update
和 upsert:true
来覆盖整个文档或插入一条新记录(如果它不存在)。
我有一个 mongo 数据库,我需要每天更新它(删除不相关的文档并添加新的文档)。 数据库未分片。
我从一个不太好用的外部数据主机中获取数据。
有2个选项: 1. 将整个数据库(不是很大)重新摄取到临时集合中,然后将其重命名为旧集合名称(dropTarget 设置为 true) 2.自己动手,删除旧的entires,从data master中找出哪些新文档是相关的,并将它们插入到DB
选项1显然是可取的,但有什么影响?我在很晚的时候进行维护,但我不希望用户在重命名过程中查询数据库时出错。
使用重命名覆盖集合是完成任务的标准方法还是我在滥用 API? :)
根据 documentation renameCollection
在操作期间阻止所有数据库 activity。如果您的用户设置了足够长的超时时间,他们将不会直接受到此重命名操作的影响,但是,由于数据集可能会在他们脚下发生变化,因此可能会产生副作用。例如,重命名集合会使打开的游标无效,从而中断当前正在返回数据的查询。
关于在生产中重命名集合,我个人会尽可能避免这种情况,首先是因为上面的游标问题,但更重要的是因为不完整的 renameCollection
操作会使目标集合处于不可用状态并且需要人工干预清理。相反,我会使用 update
和 upsert:true
来覆盖整个文档或插入一条新记录(如果它不存在)。