Loop through Mongo Collection and update a field i

2019-05-07 12:08发布

问题:

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();
}