mongoose 批量操作

Posted

技术标签:

【中文标题】mongoose 批量操作【英文标题】:Bulk operation by mongoose 【发布时间】:2015-09-27 09:02:41 【问题描述】:

我想在 MongoOSE 的一次操作中存储批量数据(超过 1000 或 10000 条记录)。但是 MongoOSE 不支持批量操作,所以我将使用本机驱动程序(MongoDB,用于插入)。我知道我会绕过所有 MongoOSE 中间件,但没关系。 (如果我错了,请纠正我!:))

我可以选择通过insert 方法存储数据。但是 MongoDB 也提供 Bulk 类(有序和无序操作)。现在我有以下问题:

insertbulk 操作之间的区别(都可以存储批量数据)? initializeUnorderedBulkOp()(以串行方式执行操作)和initializeOrderedBulkOp()(以并行方式执行操作)之间有什么具体区别吗? 如果我将使用initializeUnorderedBulkOp 那么它会影响范围搜索或任何副作用? 我可以通过 Promisification (by BlueBird) 来实现吗? (我正在努力。)

谢谢

编辑:我说的是bulkinsert 关于多次插入。哪一个更好?通过批量生成器逐一插入或在插入方法中按批次(1000)插入。我希望现在它会清除Mongoose (mongodb) batch insert?这个链接

【问题讨论】:

虽然 MongooseJS 确实通过 Model.create() 进行了批量保存,但它实际上是在创建单独的保存语句(将使用中间件),然后使用 async.parallel 执行它们。因此,如果您要进行大批量保存,那么您可能需要使用Model.collection.insert() Mongoose (mongodb) batch insert?的可能重复 猫鼬有Model.bulkWrite() 【参考方案1】:

如果您从猫鼬模型中调用它,则需要 .collection 访问器

var bulk = Model.collection.initializeOrderedBulkOp();

// examples
bulk.insert( "a": 1 );
bulk.find( "a": 1 ).updateOne( "$set":  "a": 2  );

bulk.execute(function(err,result) 
   // result contains stats of the operations
);

不过,您在执行此操作时需要“小心”。除了没有绑定到可以附加到 mongoose 模式的相同检查和验证之外,当您调用 .collection 时,您需要“确定”已经建立了与数据库的连接。 Mongoose 方法会为您解决这个问题,但是一旦您使用了底层驱动程序方法,您就只能靠自己了。

至于差异,都在命名中:

有序:表示批处理指令按照它们添加的顺序执行。它们按顺序一个接一个地执行,一次一个。如果在任何时候发生错误,批处理的执行将暂停并返回错误响应。到那时为止的所有操作都是“委托”的。这不是回滚。

UnOrdered:表示批处理操作可以“任何”顺序执行,并且通常并行执行。这可以导致更快的更新,但当然不能在批处理中的一个批量操作要在另一个之前发生的情况下使用(上面的示例)。发生的任何错误都只是在结果中“报告”,整个批次将在发送到服务器时完成。

当然,这两种执行方式与标准方法的核心区别在于,“整个批次”(实际上最多 1000 个)被发送到服务器,而您只能得到一个响应。这样可以节省网络流量并等待每个单独的.insert() 或其他类似操作完成。

至于可以使用“promise”,其他任何可以转换为返回 promise 的回调都遵循与此处相同的规则。请记住,虽然“回调/承诺”在 .execute() 方法上,并且您返回的内容符合从批量操作结果返回的内容的规则。

有关更多信息,请参阅核心文档中的"Bulk"。

【讨论】:

解释得很好。

以上是关于mongoose 批量操作的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:无效操作,没有批量操作

有啥方法可以使用 mongoose 从 mongodb 批量操作中获取修改后的 IDS?

Mongoose 批量插入子类别

尝试与 Mongoose 进行批量更新。最干净的方法是啥?

使用 Mongoose 批量删除

Mongoose 中的批量更新