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

MongoDB $милисекунда

В MongoDB, $millisecond Операторът на конвейера за агрегиране връща милисекундната част от дата като цяло число между 0 и 999 .

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

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

Пример

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

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

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

db.pets.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthMilliSecond: { $millisecond: "$born" }
        }
    }
  ]
)

Резултат:

{ "birthMilliSecond" : 123 }

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

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

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

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

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

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

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

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

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

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

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          kabul: { 
            $millisecond: { date: "$born", timezone: "Asia/Kabul" }
            },
          brisbane: { 
            $millisecond: { date: "$born", timezone: "Australia/Brisbane" }
            }
        }
    }
  ]
)

Резултат:

{ "kabul" : 123, "brisbane" : 123 } 

Тъй като промяната на часовата зона не засяга частта от милисекунди, резултатът е същият.

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

В този пример използваме UTC отместване.

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset+04:30": { 
            $millisecond: { date: "$born", timezone: "+04:30" }
            },
          "utcOffset+05:45": { 
            $millisecond: { date: "$born", timezone: "+05:45" }
            }
        }
    }
  ]
)

Резултат:

{ "utcOffset+04:30" : 123, "utcOffset+05:45" : 123 }

Връщане на милисекунди от ObjectId

Можете да използвате $millisecond за да върнете частта от милисекунди от ObjectId.

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

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

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

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Този документ съдържа ObjectId. Следователно можем да използваме $millisecond за да върнете милисекундната част от този ObjectId.

Въпреки това, както беше споменато, частта от часовата зона на ObjectId се измерва само в секунди от епохата на Unix и следователно не включва част от милисекунди.

Пример:

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

Резултат:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"millisecond" : 0
}

Можем да видим, че клеймото за време не включва част от милисекунда и резултатът е 0 .

В този случай използвах и $toDate оператор на тръбопровода за агрегиране, за да върне частта от клеймото за време на ObjectId.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използването на findOne в цикъл отнема твърде много време в Node.js

  2. Как да съхранявате геопространствена информация в mongoDB

  3. MongoDB $filter

  4. MongoDB - Какво ще кажете за десетичен тип стойност?

  5. Как се съхраняват данните в база данни MongoDB на диск?