MongoDB – 更新集合中所有logging的最快方法是什么?

我有一个有900万条logging的collections。 我正在使用以下脚本来更新整个集合:

simple_update.js

db.mydata.find().forEach(function(data) { db.mydata.update({_id:data._id},{$set:{pid:(2571 - data.Y + (data.X * 2572))}}); }); 

这是从命令行运行如下:

 mongo my_test simple_update.js 

所以我所做的只是基于简单的计算添加一个新的字段pid

有更快的方法吗? 这需要很长的时间。

有两件事你可以做。

  1. 发送一个更新'多'标志设置为true。
  2. 存储函数服务器端,并尝试使用服务器端代码执行 。

该链接还包含以下build议:

这是进行批处理pipe理工作的好方法。 在服务器上运行mongo,通过localhost接口连接。 连接速度非常快,延迟低。 这比db.eval()更友好,因为db.eval()会阻止其他操作。

这可能是你得到的最快的。 你必须认识到,在单个服务器上发布9M更新将是一个沉重的操作。 假设您可以获得每秒3千更新,您仍然在谈论运行近一个小时。

这不是一个真正的“mongo问题”,这将是一个硬件限制。

我正在使用: db.collection.update方法

 // db.collection.update( criteria, objNew, upsert, multi ) // --> for reference db.collection.update( { "_id" : { $exists : true } }, objNew, upsert, true); 

不知道是否会更快,但你可以做一个多更新。 只要说update where _id > 0 (这将是真实的每个对象),然后设置“多”标志为真,它应该做的一样,而不必遍历整个集合。

看看这个: MongoDB – 服务器端代码执行