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

MongoDB $втори

В MongoDB, $second Операторът на конвейера за агрегиране връща втората част от дата като число между 0 и 59 . Стойността може също да бъде 60 за отчитане на високосните секунди, когато е приложимо.

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

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

Пример

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

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

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

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

Резултат:

{ "birthSecond" : 15 }

Тук използвах birthSecond като име на полето, което да се върне, но това може да е всичко (като secondsAtBirth , seconds и т.н.).

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

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

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

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

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

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

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

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

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

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

Резултат:

{ "kabul" : 15, "brisbane" : 15 } 

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

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

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

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

Резултат:

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

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

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

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

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

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

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

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

Пример:

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

Резултат:

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

Виждаме, че документът е създаден на 35-та секунда (от 11-ата минута на 1-вия час на деня).

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да заявя mongodb с DBRef

  2. Как да валидирам членове на поле на масив?

  3. Mongo преобразува вградения документ в масив

  4. Как да се присъедините към множество колекции с $lookup в mongodb

  5. Как MongoDB се различава от SQL база данни