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

MongoDB $isoWeekYear

В 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 със седмицата, която съдържа първия четвъртък за годината.


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

  2. Опции за конфигурация по време на изпълнение на ClusterControl

  3. Мониторинг на Percona сървър за MongoDB – ключови показатели

  4. Mongodb Explain for Aggregation framework

  5. Съвпадение с подниз в агрегирането на mongodb