Loop through Mongo Collection and update a field in every document

孤人 提交于 2019-12-22 08:03:10

问题


I have Dates in one Collection that were inserted incorrectly, and are in a simple "2015-09-10" string format.

I'd like to update them to correct ISO Date format.

I've tried looping through Mongo with forEach() but I don't know the shell well enough on how to update each document in the collection.

So far I'm at this point:

db.getCollection('schedules').find({}).forEach(function (doc) {

    doc.time = new Date( doc.time ).toUTCString();

    printjson( doc.time );
    // ^ This just prints "Invalid Date"

    // Also none of the below work when I try saving them

    //doc.save();
    //db.getCollection('schedules').save(doc);
});

What's missing here?


回答1:


The best way to do this is using "Bulk" operations

var collection = db.getCollection('schedules');
var bulkOp = collection.initializeOrderedBulkOp();
var count = 0;
collection.find().forEach(function(doc) {
    bulkOp.find({ '_id': doc._id }).updateOne({
        '$set': { 'time': new Date(doc.time) }
    });
    count++;
    if(count % 100 === 0) {
        // Execute per 100 operations and re-init
        bulkOp.execute();
        bulkOp = collection.initializeOrderedBulkOp();
    }
});

// Clean up queues
if(count > 0) {
    bulkOp.execute();
}


来源:https://stackoverflow.com/questions/33530357/loop-through-mongo-collection-and-update-a-field-in-every-document

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!