Чтобы преобразовать поле строкового типа в поле даты, вам нужно будет перебрать курсор, возвращенный методом find()
, используя forEach()
метод, в цикле преобразуйте поле в объект Date, а затем обновите поле с помощью оператора $set
.
TakeПреимущество использования Bulk API для массовых обновлений, которые обеспечивают более высокую производительность, поскольку вы будете отправлять операции на сервер партиями, скажем, 1000, что даст вам лучшую производительность, поскольку вы неотправка каждого запроса на сервер, только один раз на каждые 1000 запросов.
Далее демонстрируется этот подход, в первом примере используется Bulk API, доступный в версиях MongoDB >= 2.6 and < 3.2
.Он обновляет все документы в коллекции, заменяя все поля created_at
на поля даты:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new Date(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(); }
Следующий пример относится к новой версии MongoDB 3.2
, которая с устарел Bulk API и предоставил более новый набор API, используя bulkWrite()
:
var bulkOps = [];
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new Date(doc.created_at);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "created_at": newDate } }
}
}
);
})
db.collection.bulkWrite(bulkOps, { "ordered": true });