В MongoDB, $dateToParts
операторът на тръбопровода за агрегиране връща частите от датата на дадена дата.
По-конкретно, той връща документ, който съдържа съставните части на дадена стойност за дата на BSON като отделни свойства.
Частите за дата, върнати от $dateToParts
са year
, month
, day
, hour
, minute
, second
и millisecond
.
Когато използвате $dateToParts
оператор, можете по избор да посочите часова зона, която да използвате за резултата.
$dateToParts
операторът приема или дата (като дата, клеймо за време или ObjectId), или документ, който посочва датата и часовата зона за използване.
Пример
Да предположим, че имаме колекция, наречена pets
със следния документ:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Можем да изпълним следния код, за да върнем различните части от датата от born
поле в този документ.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Резултат:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Можем да видим, че всяка част от датата се връща в собствено поле.
Тук използвах dateParts
като име на полето, което да се върне, но това може да е всичко (като theDate
и т.н.).
_id
полето се връща по подразбиране при използване на проекции в MongoDB, но в този пример изрично скрих _id
поле с помощта на _id: 0
.
Посочете часова зона
Можете да посочите часова зона, която да използвате за изхода на $dateToParts
оператор.
Когато направите това, аргументът се предава на $dateToParts
трябва да бъде в следната форма:
{ date: <dateExpression>, timezone: <tzExpression> }
Където <dateExpression>
е датата за използване и <tzExpression>
е часовата зона за използване.
Часовата зона може да бъде определена с помощта на идентификатора на часовата зона на Олсън (напр. "Europe/London"
, "GMT"
) или отместването на UTC (напр. "+02:30"
). , "-1030"
).
Идентификатор на часовата зона на Олсън
Ето пример, който извежда частите от датата в две различни часови зони, всяка от които използва идентификаторите на часовата зона на Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
).pretty()
Резултат:
{ "honolulu" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "auckland" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 12, "minute" : 30, "second" : 15, "millisecond" : 123 } }
В този случай датата се премества напред към следващата година/месец/седмица/ден/час, когато използвате Pacific/Auckland
часова зона.
Изместване на UTC
Ето същия пример, освен че този път използваме UTC отместване.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$dateToParts: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$dateToParts: { date: "$born", timezone: "+1200" }
}
}
}
]
).pretty()
Резултат:
{ "utcOffset-1000" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "utcOffset+1200" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 11, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Части за дата от седмицата на ISO
Можете да използвате iso8601: true
за да промените изходния документ, за да използвате полетата за дата на ISO седмицата. Това базира датата на стандарта ISO 8601.
Да предположим, че имаме колекция, наречена cats
със следния документ:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Можем да изпълним следния код, за да извлечем ISO полетата за дата от born
поле в този документ.
Ето пример за демонстрация:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateParts: {
$dateToParts: {
date: "$born"
}
},
datePartsISO: {
$dateToParts: {
date: "$born",
iso8601: true
}
}
}
}
]
).pretty()
Резултат:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 }, "datePartsISO" : { "isoWeekYear" : 2020, "isoWeek" : 53, "isoDayOfWeek" : 4, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Първият изходен документ използва нормалния изход за дата. Вторият документ използва полетата и стойностите за дата на ISO седмицата.
Връщане на части за дата от ObjectId
Можете да използвате $dateToParts
за да върнете частите от датата от ObjectId.
Стойностите на ObjectId са 12 байтови шестнадесетични стойности, които се състоят от:
- 4 байтова стойност на времеви печат, представляваща създаването на ObjectId, измерена в секунди от епохата на Unix.
- 5 байта е произволна стойност
- Брояч с нарастващ 3 байта, инициализиран на произволна стойност.
За да обобщим, нашият документ изглежда така:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Този документ съдържа ObjectId. Следователно можем да използваме $dateToParts
за да върнем частите от датата въз основа на датата, на която е създаден нашия документ (или по-точно, когато _id
стойността ObjectId на полето е създадена).
Пример:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"dateParts": { $dateToParts: { date: "$_id" } }
}
}
]
).pretty()
Резултат:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "dateParts" : { "year" : 2021, "month" : 1, "day" : 19, "hour" : 1, "minute" : 11, "second" : 35, "millisecond" : 0 } }
В този случай използвах и $toDate
оператор на тръбопровода за агрегиране, за да върне частта от клеймото за време на ObjectId.