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 。
有更快的方法吗? 这需要很长的时间。
有两件事你可以做。
- 发送一个更新'多'标志设置为true。
- 存储函数服务器端,并尝试使用服务器端代码执行 。
该链接还包含以下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 – 服务器端代码执行