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

MongoDB $isoWeek

В MongoDB, $isoWeek Операторът на тръбопровода за агрегиране връща номера на седмицата във формат ISO 8601, вариращ от 1 до 53 .

Когато използвате $isoWeek оператор, можете по избор да посочите часова зона, която да използвате за резултата.

$isoWeek операторът приема или дата (като дата, клеймо за време или ObjectId), или документ, който посочва датата и часовата зона за използване.

Пример

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

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

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

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeek: { $isoWeek: "$born" }
        }
    }
  ]
)

Резултат:

{ "birthIsoWeek" : 53 } 

Виждаме, че ISO седмицата всъщност е 53, въпреки че датата е през януари. Това е така, защото седмицата започна в края на предходната година и все още не е приключила. Ето как работят ISO седмиците.

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

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

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

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

Когато направите това, аргументът се предава на $isoWeek трябва да бъде в следната форма:

{ date: <dateExpression>, timezone: <tzExpression> }

Където <dateExpression> е датата за използване и <tzExpression> е часовата зона за използване.

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

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

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

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $isoWeek: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $isoWeek: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
)

Резултат:

{ "honolulu" : 53, "auckland" : 1 } 

В този случай датата се премества напред към следващата седмица по ISO, когато се използва Pacific/Auckland часова зона.

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

Ето същия пример, освен че този път използваме UTC отместване.

db.cats.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $isoWeek: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $isoWeek: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
)

Резултат:

{ "utcOffset-1000" : 53, "utcOffset+1200" : 1 }

Връщане на ISO седмицата от ObjectId

Можете да използвате $isoWeek за да върнете ISO седмицата от ObjectId.

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

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

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

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

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

Пример:

db.cats.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "isoWeek": { $isoWeek: "$_id" }
        }
    }
  ]
).pretty()

Резултат:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"timeStamp" : ISODate("2021-01-21T00:24:05Z"),
	"isoWeek" : 3
}

Можем да видим, че документът е създаден на 3-та седмица на годината при използване на формата ISO 8601.

В този случай използвах и $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. Как да десериализирате обект на BsonDocument обратно в клас

  2. Pymongo / MongoDB:създаване на индекс или осигуряване на индекс?

  3. MongoDB индекс за различни типове

  4. 3 начина да скриете индекс от плана на заявката в MongoDB

  5. Задайте програмно преобразувател на MongoDb