per eseguire la conversione, si avrebbe bisogno di iterare manualmente il cursore restituito dal metodo find()
sia usando il metodo forEach()
o il metodo del cursore next()
per accedere ai documenti. Withing loop, convertire il campo per un oggetto isodate e quindi aggiornare il campo utilizzando l'operatore $set
, come il seguente esempio in cui il campo viene chiamato created_at
ricopre attualmente la data in formato stringa:
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)}}
)
};
Per migliorare le prestazioni, in particolare quando si gestiscono raccolte di grandi dimensioni, sfruttare lo Bulk API per gli aggiornamenti di massa poiché si invieranno le operazioni al server in batch di 1000, che offre una prestazione migliore in quanto non si inviano tutte le richieste a il server, solo una volta ogni 1000 richieste.
Quanto segue dimostra questo approccio, il primo esempio utilizza l'API Bulk disponibile nelle versioni MongoDB >= 2.6 and < 3.2
.Si aggiorna tutti i documenti della collezione cambiando i created_at
campi ai campi data:
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(); }
Il prossimo esempio applica alla nuova MongoDB versione 3.2
che da allora deprecated the Bulk API e ha fornito una serie più recente di apis usando 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. it/articles/2010/07/09/handling-dates-in-mongodb /, non esattamente quello che vuoi ma puoi ancora dare un'occhiata –
http://stackoverflow.com/questions/2900674/how-do-i- convert-a-property-in-mongodb-from-text-to-date-type, anche dare un'occhiata a questo –