2013-10-10 5 views
0

Мне нужен запрос для оптимизации моих данных из коллекции и преобразования всех полей date_passport из формата Y-m-d в формат MongoDate, что возможно только с запросом mongo?Преобразование даты Y-m-d в MongoDate

В настоящее время:

{ 
    _id: ObjectId("522e261a7ecb75b34e000000"), 
    type: "Chat", 
    last_name: "Test", 
    date_passport: '2013-11-28' 
} 

Нужно:

{ 
    _id: ObjectId("522e261a7ecb75b34e000000"), 
    type: "Chat", 
    last_name: "Test", 
    date_passport: ISODate("2013-11-28T02:00:00.%LZ") 
} 
+2

Вы должны были бы преобразовать данные. Вы можете сделать это с консоли MongoDB. Просто пройдите по каждому из них и обновите поле 'validade_pass'. – WiredPrairie

ответ

0

Вот как я решить эту проблему:

Если данные дд/мм/гггг

db.customer.find(
    { 
     date_passport : {$nin : ['', undefined]} // find for not is empty or undefined documents 
    } 
).forEach(function(obj) { 
    if (typeof(obj.date_passport)!='object') { //check if is not already a ISODate 
     var datePt = obj.date_passport.split('/'); //split the string dd/mm/YYYY 
     var dateEn = datePt[2] + '-' + datePt[1] + '-' + datePt[0]; // reorganize to YYYY-mm-dd 

     obj.date_passport = new ISODate(dateEn); // convert in ISODate 
     db.customer.save(obj); //save and thats all 
    } 
}); 

Если ваш данные уже YYYY-mm-dd

db.customer.find(
    { 
     date_passport : {$nin : ['', undefined]} // find for not is empty or undefined documents 
    } 
).forEach(function(obj) { 
    if (typeof(obj.date_passport)!='object') { //check if is not already a ISODate 
     obj.date_passport = new ISODate(obj.date_passport); // convert in ISODate 
     db.customer.save(obj); //save and thats all 
    } 
}); 
+0

Кроме того, 'YYYY-mm-dd' - это формат [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601), поэтому он более переносим и поддерживается. ISO 8601 следует использовать, если кто-то хочет сохранить дату как строку. – leesei

+0

Но, если мне нужно запрашивать даты на mongodb, мое поле даты должно быть как объект ISODate правильно? Я имею в виду работу с датами типа mysql. То, как я вижу, хранить мои даты на манго, используя строку YYYY-mm-dd, похоже на то, что делать то же самое в mysql (хранить дату как тип строки, а не дата) таким образом, чтобы данные работали с трудом. –

+0

Я согласен с вашей точкой. Я использую ISO 8601 при отправке даты в JSON ('Date.toISOString()' или пользовательский формат в 'YYYY-mm-dd'), и иногда я использую его как литеральное строковое поле в db только тогда, когда * не требуется сравнение диапазона *. – leesei

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