我有一个最新的mongodb 3.2,并且有许多具有timeStamp的项目的集合.
需要将毫秒转换为Date对象,现在我使用此函数:
db.myColl.find().forEach(function (doc) {
doc.date = new Date(doc.date);
db.myColl.save(doc);
})
Run Code Online (Sandbox Code Playgroud)
更新2百万行需要很长时间.
我尝试使用updateMany(似乎它非常快)但我如何才能访问当前文档?有没有机会使用updateMany重写上面的查询?
谢谢.
您可以利用其他批量更新 API,例如bulkWrite()允许您使用迭代器访问文档、操作文档、将修改后的文档添加到列表中,然后将更新操作列表批量发送到服务器以执行的方法。 。
下面演示了这种方法,其中您将使用游标的forEach()方法来迭代集合并修改每个文档,同时将更新操作推送到一批大约 1000 个文档,然后可以使用该bulkWrite()方法立即更新这些文档。
这与使用 一样高效,updateMany()因为它使用相同的底层批量写入操作:
var cursor = db.myColl.find({"date": { "$exists": true, "$type": 1 }}),
bulkUpdateOps = [];
cursor.forEach(function(doc){
var newDate = new Date(doc.date);
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "date": newDate } }
}
});
if (bulkUpdateOps.length == 1000) {
db.myColl.bulkWrite(bulkUpdateOps);
bulkUpdateOps = [];
}
});
if (bulkUpdateOps.length > 0) { db.myColl.bulkWrite(bulkUpdateOps); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |