如何在MongoDB中批量插入数据时恢复错误

5

我正在使用MongoDB创建一个Web应用程序。 现在我正在创建管理员页面,使管理员能够在网站上添加或删除项目。 在该页面上,将添加批量导入功能,这使得可以从本地CSV文件导入内容。 问题是如何实现此功能。

最简单的方法是将上传的CSV文件转换为JSON,然后使用db.items.insert([{...}, {...}, ...])语句插入它们。

如果db.getLastError()返回null,则导入成功。没有问题。

但是,如果在批量插入期间发生错误,应该怎么办? 因为没有事务,所以插入的项目无法回滚。 因此,重试插入会导致重复的文档。

解决这个问题的最佳方法是什么?

1个回答

10
截至MongoDB 2.4版本,如果 批量插入 中的任何文档存在错误,则您只会收到最后一个异常。
在出现错误时回滚: 如果您希望对批量插入采用事务方法(即所有插入必须成功,否则回滚批处理),则应在要插入的文档中包含标识字段,例如batch_id。出现任何错误时,您可以从该批次中删除已插入的任何文档并适当地处理错误(重试或失败)。
批量插入方法: 如果您不是插入到分片集群中: - 将ContinueOnError标志设置为false,以确保批量插入在发生第一个错误后停止。 - 处理异常并决定是否回滚批次或重新插入从导致异常的那个文档之后开始的文档。
如果您在向分片集群中插入: - ContinueOnError标志目前始终设置为true。 - 在出现错误时,您将需要循环遍历该批次中的文档,并尝试逐个插入(或更新)它们,以便可以捕获和处理任何特定的异常。 - 另请参见:分片集合批量插入的策略

3
您也可以希望在MongoDB的Jira问题跟踪器中给SERVER-9038投票/关注。这个功能建议包括对批量插入的增强,允许您将ContinueOnError指定为true并查看哪些写操作失败(而不仅包括批处理的最后一个错误)。 - Stennie
“ContinueOnError” 似乎已经被弃用。现在如何处理 bulkOps 中的错误?bulkop 是否完全停止或继续执行其他操作? - sezanzeb

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