Mongoose 中的批量更新

Posted

技术标签:

【中文标题】Mongoose 中的批量更新【英文标题】:Bulk Update in Mongoose 【发布时间】:2018-08-22 15:29:03 【问题描述】:

例如,我有一组文档:

 "_id" : ObjectId("5b7c1527c07abb08fc28febe"), "code" : "0001", "time" : ISODate("2014-07-04T09:15:00Z"), "open" : 0, "close" : 0, "high" : 0, "low" : 0, "volume" : 0, "bVolume" : 0, "sVolume" : 0 
 "_id" : ObjectId("5b7c1527c07abb08fc28febf"), "code" : "0001", "time" : ISODate("2014-07-04T09:16:00Z"), "open" : 0, "close" : 0, "high" : 0, "low" : 0, "volume" : 0, "bVolume" : 0, "sVolume" : 0 
 "_id" : ObjectId("5b7c1527c07abb08fc28fec0"), "code" : "0001", "time" : ISODate("2014-07-04T09:17:00Z"), "open" : 0, "close" : 0, "high" : 0, "low" : 0, "volume" : 0, "bVolume" : 0, "sVolume" : 0 
 "_id" : ObjectId("5b7c1527c07abb08fc28fec1"), "code" : "0001", "time" : ISODate("2014-07-04T09:18:00Z"), "open" : 0, "close" : 0, "high" : 0, "low" : 0, "volume" : 0, "bVolume" : 0, "sVolume" : 0 
 "_id" : ObjectId("5b7c1527c07abb08fc28fec2"), "code" : "0001", "time" : ISODate("2014-07-04T09:19:00Z"), "open" : 0, "close" : 0, "high" : 0, "low" : 0, "volume" : 0, "bVolume" : 0, "sVolume" : 0 

我想检索和操作它们,然后在 mongodb 中更新它们。使用 mongoose 中的 save() 函数一一保存它们的运行速度非常慢。有没有可能一次保存所有的阵列?请注意,每个查询都会返回近 300,000 个文档。建议一种在nodejs中循环遍历它们而不会遇到堆栈溢出的方法(真正的堆栈溢出不是网站:P)会很方便。提前致谢。

【问题讨论】:

【参考方案1】:

要在更新文档之前执行一些操作,您可以使用 MongoDB 中提供的Bulk Operation。批量操作有两种类型:

    db.collection.initializeUnorderedBulkOp() db.collection.initializeOrderedBulkOp()

在 Mongoose 中,将 db 替换为 model 名称,并确保与 db 的连接正常。在执行批量操作之前,通过updatecallback 设置文档中的值(如果您基于获取的值进行操作)。

var bulkOperation = Model.collection.initializeUnorderedBulkOp();
bulkOperation.find(<query>).update(<update>);
bulkOperation.find(<query2>).update(<update2>);
...and so on.
bulkOperation.execute(function(err) 

);

【讨论】:

更新中如何引用当前文档?

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

Mongoose:如何从 find() 批量更新修改后的数据

Mongoose (mongodb) 批量插入、删除、更新和无操作

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

PLSQL中批量更新数据

为啥批量插入/更新更快?批量更新如何工作?

knex 中的批量更新