猫鼬批量更新

时间:2018-08-22 15:29:04

标签: node.js mongodb mongoose mongodb-query bigdata

例如,我有一组文档:

{ "_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 个答案:

答案 0 :(得分:0)

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

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

在猫鼬中,将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) {

});