Один подход можно взять в преобразовании поля к нужному объекту дата будет разделив строку на данный разделитель "-"
. Используйте parseInt()
для преобразования строк с разделителями в число, а конструктор new Date()
строит Date
из этих частей: первая часть будет годом, вторая часть месяца, а последняя часть на следующий день. Поскольку Date
использует номера месяца на основе нуля, вы должны вычесть его из числа месяца.
Следующая демонстрирует этот подход:
var cursor = db.patient.find({"birthDate": {"$exists": true, "$type": 2 }});
while (cursor.hasNext()) {
var doc = cursor.next();
var parts = doc.birthDate.split("-");
var dt = new Date(
parseInt(parts[0], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[2], 10) // day
);
db.patient.update(
{"_id": doc._id},
{"$set": {"birthDate": dt}}
)
};
Для повышения производительности, особенно при работе с большими коллекциями, воспользоваться помощью Bulk API для оптовых обновлений, как вы будете отправлять операции на сервер в пакетах 500, что дает вам лучшую производительность, так как вы не отправляете каждый запрос на сервер всего один раз в каждые 500 запросов.
Ниже приведен пример этого подхода. В первом примере используется Bulk API, доступный в версиях MongoDB >= 2.6 and < 3.2
. Он обновляет все документов в коллекции путем изменения OrderDate
полея в поле даты:
var bulk = db.patient.initializeUnorderedBulkOp(),
counter = 0;
db.patient.find({"birthDate": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var parts = doc.birthDate.split("-");
var dt = new Date(
parseInt(parts[0], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[2], 10) // day
);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "birthDate": dt}
});
counter++;
if (counter % 500 == 0) {
bulk.execute(); // Execute per 500 operations and re-initialize every 500 update statements
bulk = db.patient.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 500 != 0) { bulk.execute(); }
Следующий пример относится к новой MongoDB версии 3.2
которая с тех пор deprecated the Bulk API и предоставила новую набор APIs использованием bulkWrite()
:
var bulkOps = db.patient.find({"birthDate": {"$exists": true, "$type": 2 }}).map(function (doc) {
var parts = doc.birthDate.split("-");
var dt = new Date(
parseInt(parts[0], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[2], 10) // day
);
return {
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "birthDate": dt } }
}
};
})
db.patient.bulkWrite(bulkOps);
, что на стороне клиента будет использовать? C#, java javascript? ->, который может указывать на код стороны cliend в необходимом – profesor79