MongoDB: Удалите часть времени из строки DateTime

#mongodb

Вопрос:

У меня есть строка даты/времени, и я хотел бы преобразовать ее в дату без указания времени. Я хотел бы добавить еще одно поле для хранения этого нового значения. Я попробовал ниже, но это не работает. Есть ли способ удалить часть времени из строки ?

Объект

 [{ 
 
    "ID" : "001247174102", 
    "VersionInfo" : {
        "IsLatestVersion" : true, 
        "VersionDate" : "2019-09-19T10:23:46.429-06:00"
    }
}]


TESTONE = {
   $addFields: {
      DateTest: {$dateFromString: { format: "%Y-%m-%d", dateString: "$VersionInfo.VersionDate",    onNull: new Date(0)} }
   }
};
 

Комментарии:

1. Хранение значений даты/времени в виде строк является недостатком дизайна, всегда используйте правильные Date объекты. В Mongo 5.0 вы можете использовать $dateTrunc для удаления временной части, т. Е. Установить время на 00:00:00

2. Я знаю, но я больше не могу изменять базу данных 🙁

Ответ №1:

Как уже было написано, вы никогда не должны хранить значения даты/времени в виде строки. Поэтому в этом случае сначала создайте правильные Date объекты, а затем установите время, чтобы 00:00:00 :

 {
   $addFields: {
      DateTest: {
         $dateFromString: { 
           format: "%Y-%m-%dT%H:%M:%S.%Lz", 
           dateString: "$VersionInfo.VersionDate",    
           onNull: new Date(0)
         } 
      }
   }
},
{
   $set: {
      DayTest: {
         $dateFromParts: { 
           year: {$year: "$DateTest"}, 
           month: {$month: "$DateTest"}, 
           day: {$dayOfMonth: "$DateTest"}
         }
      }
   }
},
 

Если вы уже запускаете версию 5.0 Mongo, вы можете сделать ее короче:

 {
   $addFields: {
      DateTest: {
         $dateFromString: { 
           format: "%Y-%m-%dT%H:%M:%S.%Lz", 
           dateString: "$VersionInfo.VersionDate",    
           onNull: new Date(0)
         } 
      }
   }
},
{
   $set: {
      DayTest: {
         $dateTrunc: { 
           date: "$DateTest",
           unit: "day"
         }
      }
   }
},