如何在MongoDB中批量插入期间从错误中恢复

Aki*_*RAI 4 mongodb

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

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

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

但是,如果批量插入期间发生错误,应该怎么做?由于没有事务,因此无法回滚插入的项目.因此,重试插入将导致重复的文档.

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

Ste*_*nie 10

与MongoDB 2.4一样,如果批量插入中的任何文档出错,您将只获得最后一个异常.

回滚失败

如果您希望对批量插入使用事务方法(即所有插入必须成功,或者回滚批处理),那么您应该batch_id在插入的文档中包含一个标识字段.如果发生任何故障,您可以删除从该批处理中插入的任何文档并相应地处理错误(重试或失败).

批量插入方法

如果您没有插入分片群集:

  • ContinueOnError标志设置为false以确保批量插入在第一个错误上停止
  • 处理异常并决定是否在导致异常的文档之后回滚批处理或从文档开始重新插入

如果你插入一个分片集群:

  • ContinueOnError标志当前始终设置为true
  • 如果出现错误,您将不得不遍历该批处理中的文档并尝试单独插入(或插入)它们,以便捕获并处理任何特定的异常.
  • 另请参见:Sharded Clusters中的批量插入策略.

  • 您可能还希望在MongoDB Jira问题跟踪器中upvote/watch [SERVER-9038](https://jira.mongodb.org/browse/SERVER-9038).此功能建议包括批量插入的增强功能,允许您将"ContinueOnError"指定为"true"并查看哪些写入失败(而不是仅包括批处理的最后一个错误). (3认同)