2016-02-29 13 views
2

У меня есть моя дата рождения в строчном формате, подобном этому «2010-03-22». Я хочу преобразовать его в тип Date в MongoDB.Преобразование дат из формата String в формат даты в mongodb

Какую функцию db.patient.update() следует написать? Я хочу рассчитать возраст каждого человека.

Я воспользовался разрешением дать How do I convert a property in MongoDB from text to date type?, но все даты были преобразованы в "1970-01-01T00: 00: 00.000Z".

+0

, что на стороне клиента будет использовать? C#, java javascript? ->, который может указывать на код стороны cliend в необходимом – profesor79

ответ

1

Один подход можно взять в преобразовании поля к нужному объекту дата будет разделив строку на данный разделитель "-". Используйте 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); 
+1

Спасибо, что это сработало ... :) – RAFA

2
db.collection.find().forEach(function(e){ 
e.fieldname = new Date(e.fieldname) 
db.collection.save(e) 
}); 

Если вы используете robomonogo использовать новый ISODate вместо нового Дата

Смежные вопросы