MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $dateToString

В MongoDB, $dateToString операторът на конвейера за агрегиране преобразува даден обект за дата в низ.

$dateToString операторът приема или дата, клеймо за време или ObjectId.

Можете да посочите формат, който да използвате за резултата, като предоставите спецификация на формата. Спецификацията на формата може да бъде всеки низов литерал, съдържащ 0 или повече спецификатори на формат.

Спецификацията на формата е по избор от MongoDB версия 4.0, когато featureCompatibilityVersion е настроен на 4.0 или по-високо. По-ранните версии изискват спецификацията на формата.

По желание можете да използвате timezone параметър, за да посочите часовата зона, която да използвате.

Можете също да използвате onNull параметър, за да посочите какво да върнете, ако датата е null или липсва.

Пример

Да предположим, че имаме колекция, наречена pets със следния документ:

{ "_id" :ObjectId("600631c7c8eb4369cf6ad9c8"), "name" :"Извличане", "born" :ISODate("2020-12-31T23:30:15.123Z")}

Можем да изпълним следния код, за да върнем низ от дата от born поле в този документ.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
) 

Резултат:

{ "dateString" :"2020-12-31T23:30:15.123Z" }

Този пример използва %Y-%m-%dT%H:%M:%S.%LZ като спецификация на формата. Това се случва да бъде спецификацията на формата по подразбиране, но в този случай ние изрично го посочихме. Можем да видим, че низът с дата се връща в посочения формат.

Тук използвах dateString като име на полето, което трябва да се върне, но това може да е всичко (като formattedDate , theDate и т.н.).

_id полето се връща по подразбиране при използване на проекции в MongoDB, но в този пример изрично скрих _id поле с помощта на _id: 0 .

Вижте MongoDB $dateToString Форматни спецификатори за списък с налични спецификатори на формат.

Изход по подразбиране

Както споменахме, спецификацията на формата в предишния пример е спецификацията на формата по подразбиране.

Ако използвате MongoDB версия 4.0 или по-нова, с featureCompatibilityVersion зададен на 4.0 или по-висока (вижте как да видите текущата си featureCompatibilityVersion и как да го настроите), можете да пропуснете спецификацията на формата, ако искате датата да бъде форматирана с помощта на горния формат.

Следователно бихме могли да пренапишем предишното. пример за това:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
) 

Резултат:

{ "dateString" :"2020-12-31T23:30:15.123Z" }

Посочете часова зона

Можете да посочите часова зона, която да използвате за изхода на $dateToString оператор.

Часовата зона може да бъде определена с помощта на идентификатора на часовата зона на Олсън (напр. "Europe/London" , "GMT" ) или отместването на UTC (напр. "+02:30"). , "-1030" ).

Идентификатор на часовата зона на Олсън

Ето пример, който извежда низа за дата в три различни часови зони, всяка от които използва идентификаторите на часовата зона на Olson:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty() 

Резултат:

{ "UTC" :"2020-12-31T23:30", "Хонолулу" :"2020-12-31T13:30", "Окланд" :"2021-01-01T12:30"}

Изместване на UTC

Ето пример, който използва UTC отместване.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty() 

Резултат:

{ "UTC" :"2020-12-31T23:30", "Хонолулу" :"2020-12-31T13:30", "Окланд" :"2021-01-01T11:30"}

Формат на датата на седмицата по ISO

Има няколко спецификатора на формат, които ви позволяват да изведете низ от дата, като използвате формата ISO 8601.

По-специално, можете да използвате:

Определител на формата Изход
%G Година във формат ISO 8601
%u Номер на деня от седмицата във формат ISO 8601 (1-понеделник, 7-неделя)
%V Седмица на годината във формат ISO 8601

Да предположим, че имаме колекция, наречена cats със следния документ:

{ "_id" :ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" :"Scratch", "born" :ISODate("2021-01-03T23:30:15.123Z")}

Можем да изпълним следния код, за да извлечем ISO полетата за дата от born поле в този документ.

Ето пример за демонстрация:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
) 

Резултат:

{ "isoYear" :"2020", "isoDayOfWeek" :"7", "isoWeekOfYear" :"53" }

За разлика от това, по-долу е същият пример, но използвайки частите за дата от седмицата, която не е ISO.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
) 

Резултат:

{ "year" :"2021", "dayofweek" :"1", "weekofyear" :"01" }

Виждаме, че резултатът е съвсем различен.

onNull Параметър

onNull параметърът може да се използва, за да посочи какво да върне, ако датата е нула или не съществува.

Стойността, предоставена на onNull параметърът може да бъде всеки валиден израз.

Ето един пример:

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
) 

Резултат:

{ "dateString" :"Не е предоставена дата" }

В този случай датата е null и така изходният документ включва низа, който предоставих за onNull параметър.

Връщане на части за дата от ObjectId

Можете да използвате $dateToString за да върнете низ за дата от ObjectId.

Стойностите на ObjectId са 12 байтови шестнадесетични стойности, които се състоят от:

  • 4 байтова стойност на времеви печат, представляваща създаването на ObjectId, измерена в секунди от епохата на Unix.
  • 5 байта е произволна стойност
  • Брояч с нарастващ 3 байта, инициализиран на произволна стойност.

За да обобщим, първият ни документ изглежда така:

{ "_id" :ObjectId("600631c7c8eb4369cf6ad9c8"), "name" :"Извличане", "born" :ISODate("2020-12-31T23:30:15.123Z")}

Този документ съдържа ObjectId. Следователно можем да използваме $dateToString за да върнете низ от дата въз основа на датата, на която е създаден нашия документ (или по-точно, когато _id стойността ObjectId на полето е създадена).

Пример:

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty() 

Резултат:

{ "_id" :ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" :ISODate("2021-01-19T01:11:35Z"), "dateString" :"19-01-2021"} 

В този случай реших да върна само частта за дата (не частта за времето). Също така промених реда на дните, месеците и годината, за да демонстрирам, че със сигурност можете да направите това, ако е необходимо.

Използвах и $toDate оператор на тръбопровода за агрегиране, за да върне частта от клеймото за време на ObjectId.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да промените структурата на резултатите за намаляване на картата на MongoDB?

  2. MongoDB заявка за връщане само на вграден документ

  3. Сортиране на агрегиране addToSet резултат

  4. MongoDB $replaceAll

  5. Актуализиране на полето в точен масив от елементи в MongoDB