В 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.