para hacer la conversión, lo que tendría que recorrer manualmente el cursor devuelto por el método find()
, ya sea usando el método forEach()
o el método del cursor next()
para acceder a los documentos. En el canto del bucle, convertir el campo a un objeto ISODate y luego actualizar el campo usando el operador $set
, como en el siguiente ejemplo en el que el campo se llama created_at
y actualmente contiene la fecha en formato de cadena:
var cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }});
while (cursor.hasNext()) {
var doc = cursor.next();
db.collection.update(
{"_id" : doc._id},
{"$set" : {"created_at" : new ISODate(doc.created_at)}}
)
};
Para un mejor rendimiento, especialmente cuando se trata de colecciones grandes, aproveche el Bulk API para realizar actualizaciones masivas ya que enviará las operaciones al servidor en lotes de, por ejemplo, 1000 que le ofrece un mejor rendimiento ya que no está enviando todas las solicitudes a el servidor, solo una vez en cada 1000 solicitudes
Lo siguiente demuestra este enfoque, el primer ejemplo usa la API Bulk disponible en las versiones de MongoDB >= 2.6 and < 3.2
.En él se actualiza todos los los documentos de la colección cambiando los created_at
campos a los campos de fecha:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new ISODate(doc.created_at);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "created_at": newDate}
});
counter++;
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 1000 != 0) { bulk.execute(); }
El siguiente ejemplo se aplica a la nueva versión MongoDB 3.2
que desde entonces ha deprecated the Bulk API y proporcionó una nueva serie de API utilizando bulkWrite()
:
var bulkOps = [],
cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }});
cursor.forEach(function (doc) {
var newDate = new ISODate(doc.created_at);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "created_at": newDate } }
}
}
);
if (bulkOps.length === 500) {
db.collection.bulkWrite(bulkOps);
bulkOps = [];
}
});
if (bulkOps.length > 0) db.collection.bulkWrite(bulkOps);
http: // developwithstyle. com/articles/2010/07/09/handling-dates-in-mongodb /, no es exactamente lo que quiere, pero todavía puede echar un vistazo –
http://stackoverflow.com/questions/2900674/how-do-i- convert-a-property-in-mongodb-from-text-to-date-type, también mira en este –