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
的连接正常。在执行批量操作之前,通过update
或callback
设置文档中的值(如果您基于获取的值进行操作)。
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) 批量插入、删除、更新和无操作