首页 > 解决方案 > Mongoose 中的批量更新

问题描述

例如,我有一组文件:

{ "_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)会很方便。提前致谢。

标签: node.jsmongodbmongoosemongodb-querybigdata

解决方案


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

  1. db.collection.initializeUnorderedBulkOp()
  2. db.collection.initializeOrderedBulkOp()

在 Mongoose 中,将 替换为dbnamemodel并确保与 的连接db正常。在执行批量操作之前,如果您根据获取的值进行操作,请通过update或使用 a设置文档中的值。callback

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

});

推荐阅读