node.js - MongoDB 批量插入已经存在许多文档的地方

标签 node.js mongodb bulkinsert

我有一个较大的 (~100) 个小型文档数组(每个文档可能有 10 个字段)要插入到 MongoDB 中。但是它们中的许多(也许全部,但通常是 80% 左右)已经存在于数据库中。这些文件代表 future 几个月即将发生的事件,我每两天更新一次数据库。所以大部分事件都已经在那里了。

任何人都知道(或想猜测)是否更有效:

  1. 进行批量更新,但使用 continueOnError = true,例如

db.collection.insert(myArray, {continueOnError: true}, 回调)

  1. 单独插入,首先检查 _ID 是否存在?

  2. 首先进行一次大删除(类似于 db.collection.delete({_id: $in : [array of all the IDs in my new documents] }),然后进行批量删除插入?

我可能会做 #1,因为这是最简单的,而且我认为 100 个文档没有那么大,所以这可能无关紧要,但如果有 10,000 个文档呢?如果重要的话,我正在使用 node.js 驱动程序在 JavaScript 中执行此操作。我的背景是 Java,其中异常非常耗时,这就是我要问的主要原因 - “continueOnError”选项会耗时吗???

添加:我认为“upsert”没有意义。那是为了更新单个文档。在我的例子中,代表即将发生的事件的单个文档没有改变。 (好吧,也许是,那是另一个问题)

现在的情况是将添加一些新文档。

最佳答案

My background is in Java where exceptions are time consuming and that's the main reason I'm asking - will the "continueOnError" option be time consuming???

Bulk InsertsContinueOnError 标志只影响批处理的行为:不是在遇到第一个错误时停止处理,而是处理整个批处理。

在 MongoDB 2.4 中,批处理只会出现一个错误,这将是遇到的最后一个错误。这意味着如果您确实关心捕获错误,那么您最好进行单独的插入。

与单次插入相比,批量插入节省的主要时间是减少了网络往返。驱动程序可以将批量插入分解为多达 MaxMessageSizeBytes 的批处理,而不是向 MongoDB 服务器发送消息被 mongod 服务器接受(当前为 48Mb)。

批量插入是否适合此用例?

鉴于您的用例只有 100 多个(甚至 1000 个)文档要插入,而其中 80% 已经存在,使用批量插入可能不会带来巨大好处(尤其是如果此过程仅每隔几天发生一次)。你的小插入会被批量合并,但 80% 的文档实际上并不需要发送到服务器。

我仍然倾向于使用 ContinueOnError 进行批量插入,而不是您的删除和重新插入方法,但是考虑到您正在争论的文档数量和实际插入的百分比,批量插入可能是不必要的早期优化需要插入。

我建议使用不同的方法运行几次,以查看对您的用例的实际影响。

MongoDB 2.6

请注意,批处理功能在 MongoDB 2.5 开发系列中得到了显着改进(最终将在 2.6 生产版本中达到顶峰)。计划的功能包括支持批量更新插入和累积每个文档的错误,而不是每批处理的单个错误。

新的写入命令需要驱动程序更改才能支持,但可能会改变上面的一些假设。例如,通过 ContinueOnError 使用新的批处理 API,您最终可能会得到一个结果,其中 80% 的批处理 ID 是重复键。

更多详细信息,请参见父问题SERVER-9038在 MongoDB 问题跟踪器中。

关于node.js - MongoDB 批量插入已经存在许多文档的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316898/

相关文章:

node.js - mac 使用带有 ssl 证书的 Node 验证失败

node.js - Heroku:应用程序 fork 后出现 Git 错误

mongodb - 与托管Mongodb进行Grails集成测试

node.js + sequelize 批量插入

node.js - 有没有办法使用 npm Sequelize 向 SQL Server 插入超过 150K 的记录?

mysql - Node.js mysql查询响应延迟

node.js - 认证成功后获取输入的数据

json - 在 NodeJS 中将多个文件中的 JSON 对象插入到 MongoDB 的最有效方法

mongodb - 如何在 mongodb 中执行 'not-in' 操作?

sql - 使用 BULK INSERT 时忽略某些列