В MongoDB, $isoWeekYear
Операторът на тръбопровода за агрегиране връща годината с номериране на седмици по ISO за дадена стойност за дата. Това е номерът на годината във формат ISO 8601.
Когато използвате $isoWeekYear
оператор, можете по избор да посочите часова зона, която да използвате за резултата.
$isoWeekYear
операторът приема или дата (като дата, клеймо за време или ObjectId), или документ, който определя датата и часовата зона за използване.
Пример
Да предположим, че имаме колекция, наречена cats
със следния документ:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Можем да изпълним следния код, за да извлечем ISO годината от born
поле в този документ.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Резултат:
{ "birthIsoWeekYear" : NumberLong(2020) }
Можем да видим, че годината по ISO всъщност е 2020, въпреки че датата посочва 2021. Това е така, защото годината по ISO не приключва, докато не приключи последната седмица. И в този случай седмицата започна в края на предходната година и все още не е приключила. Ето как работят ISO годините.
Тук използвах birthIsoWeekYear
като име на полето, което трябва да се върне, но това може да е всичко (като isoWeekYear
, isoYear
и т.н.).
_id
полето се връща по подразбиране при използване на проекции в MongoDB, но в този пример изрично скрих _id
поле с помощта на _id: 0
.
Посочете часова зона
Можете да посочите часова зона, която да използвате за изхода на $isoWeekYear
оператор.
Когато направите това, аргументът се предава на $isoWeekYear
трябва да бъде в следната форма:
{ date: <dateExpression>, timezone: <tzExpression> }
Където <dateExpression>
е датата за използване и <tzExpression>
е часовата зона за използване.
Часовата зона може да бъде определена с помощта на идентификатора на часовата зона на Олсън (напр. "Europe/London"
, "GMT"
) или отместването на UTC (напр. "+02:30"
). , "-1030"
).
Идентификатор на часовата зона на Олсън
Ето пример, който извежда ISO годината в две различни часови зони, всяка от които използва идентификаторите на часовата зона на Olson:
db.cats.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$isoWeekYear: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
)
Резултат:
{ "honolulu" : NumberLong(2020), "auckland" : NumberLong(2021) }
В този случай датата се премества напред към следващата година по ISO, когато се използва Pacific/Auckland
часова зона.
Изместване на UTC
Ето същия пример, освен че този път използваме UTC отместване.
db.cats.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$isoWeekYear: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$isoWeekYear: { date: "$born", timezone: "+1200" }
}
}
}
]
)
Резултат:
{ "utcOffset-1000" : NumberLong(2020), "utcOffset+1200" : NumberLong(2021) }
Върнете ISO годината от ObjectId
Можете да използвате $isoWeekYear
за да върнете частта от годината на ISO от ObjectId.
Стойностите на ObjectId са 12 байтови шестнадесетични стойности, които се състоят от:
- 4 байтова стойност на времеви печат, представляваща създаването на ObjectId, измерена в секунди от епохата на Unix.
- 5 байта е произволна стойност
- Брояч с нарастващ 3 байта, инициализиран на произволна стойност.
За да обобщим, нашият документ изглежда така:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Този документ съдържа ObjectId. Следователно можем да използваме $isoWeekYear
за да върне ISO годината, в която е създаден нашия документ (или по-точно, когато _id
стойността ObjectId на полето е създадена).
Пример:
db.cats.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"isoWeekYear": { $isoWeekYear: "$_id" }
}
}
]
).pretty()
Резултат:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "timeStamp" : ISODate("2021-01-21T00:24:05Z"), "isoWeekYear" : NumberLong(2021) }
Можем да видим, че документът е създаден през годината по ISO 2021.
В този случай използвах и $toDate
оператор на тръбопровода за агрегиране, за да върне частта от клеймото за време на ObjectId.
Относно системата за дати за седмицата на ISO
Системата за дата на седмицата на ISO е календарна система, която е част от стандарта за дата и час ISO 8601, издаден от Международната организация по стандартизация (ISO). Системата определя седмична година отгоре на григорианския календар, като дефинира нотация за редовни седмици от годината.
Годините с номериране на седмици по ISO имат 52 или 53 пълни седмици. Това означава, че има 364 или 371 дни в годината, вместо обичайните 365 или 366 дни.
ISO седмиците започват от понеделник. Всяка година на ISO седмицата е григорианската година, в която се пада четвъртъкът. Номерата на ISO седмиците започват от 1
със седмицата, която съдържа първия четвъртък за годината.