如何在updateMany中获取要更新的当前文档的指针

Rom*_*lko 6 mongodb

我有一个最新的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重写上面的查询?

谢谢.

chr*_*dam 5

您可以利用其他批量更新 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)