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

MongoDB $dateFromParts

В MongoDB, $dateFromParts Операторът на конвейера за агрегиране конструира и връща обект Date от съставните части на датата.

Вие предоставяте всяка част от датата като отделно поле.

Ако е необходимо, можете да посочите полетата си за съставна дата в ISO формат на датата на седмицата.

Пример

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

{
	"_id" : 1,
	"year" : 2020,
	"month" : 12,
	"day" : 31,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123
}

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

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

db.dateParts.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond"
         }
      }
   }
}])

Резултат:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }

Всички части за дата/час са преобразувани в един обект за дата.

Часови зони

Можете да използвате timezone поле, за да посочите часова зона.

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

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

Ето пример, който използва идентификатори на часовата зона на Олсън за извеждане на три различни дати от един документ въз основа на три различни часови зони.

db.dateParts.aggregate([
{
   $project: {
      dateUTC: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      },
      dateHonolulu: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Honolulu"
         }
      },
      dateAuckland: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      }
   }
}]).pretty()

Резултат:

{
	"_id" : 1,
	"dateUTC" : ISODate("2020-12-31T10:30:25.123Z"),
	"dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"dateAuckland" : ISODate("2020-12-31T10:30:25.123Z")
}

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

Ето пример, който използва UTC отместване.

db.dateParts.aggregate([
{
   $project: {
      "date+00:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+00:00"
         }
      },
      "date-10:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "-10:00"
         }
      },
      "date+12:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+12:00"
         }
      }
   }
}]).pretty()

Резултат:

{
	"_id" : 1,
	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
}

Формат на датата на седмицата по ISO

Частите за дата могат да бъдат посочени с помощта на формата ISO 8601, ако е необходимо.

По-специално, можете да използвате:

Определител на формата Изход
isoWeekYear Година във формат ISO 8601. Това поле е задължително, ако не се използва yearyear се изисква, ако не се използва isoWeekYear ).
isoWeek Седмица на годината във формат ISO 8601. Може да се използва само с isoWeekYear .
isoDayOfWeek Ден от седмицата (1-понеделник, 7-неделя). Може да се използва само с isoWeekYear .

Да предположим, че вмъкваме втори документ, който изглежда така:

{
	"_id" : 2,
	"isoWeekYear" : 2021,
	"isoWeek" : 32,
	"isoDayOfWeek" : 7,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123,
	"timezone" : "UTC"
}

Можем да видим, че използва isoWeekYear , isoWeek и isoDayOfWeek вместо year , month и day (което използва първият документ).

Можем да използваме следния код, за да изградим обект Date от този документ:

db.dateParts.aggregate([
  { $match: { _id: 2} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "isoWeekYear": "$isoWeekYear", 
              "isoWeek": "$isoWeek", 
              "isoDayOfWeek": "$isoDayOfWeek", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond", 
              "timezone": "$timezone"
          }
        }
    }
  }
])

Резултат:

{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") } 

Полета извън обхват

Започвайки от MongoDB 4.4, поддържаният диапазон от стойности за year и isoWeekYear е 1-9999 . В предишни версии долната граница за тези стойности беше 0 и поддържаният диапазон от стойности е 0-9999 .

Започвайки от MongoDB 4.0, ако стойността е посочена за полета, различни от year , isoWeekYear и timezone е извън валидния диапазон, $dateFromParts операторът носи или изважда разликата от други части за дата, за да изчисли датата.

Стойности, по-високи от диапазона

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

{
	"_id" : 3,
	"year" : 2020,
	"month" : 14,
	"day" : 65,
	"hour" : 48,
	"minute" : 130,
	"second" : 625,
	"millisecond" : 123
}

Много от полетата за дата и час в този документ са по-високи от съответните им валидни диапазони.

Нека изпълним следната команда, за да я преобразуваме в обект Date:

db.dateParts.aggregate([
  { $match: { _id: 3} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Резултат:

{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }

Можем да видим, че частите за дата в получения обект Date са различни от съответните им части от дата в документа. Това е така, защото $dateFromParts преизчисли датата, за да отчете стойностите на частта от датата, които надхвърлят нормалния си диапазон.

Стойности по-ниски от диапазона

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

{
	"_id" : 4,
	"year" : 2020,
	"month" : 0,
	"day" : 0,
	"hour" : 0,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 0
}

Много от полетата за дата и час в този документ са по-ниски от съответните им валидни диапазони.

Нека изпълним следната команда, за да я преобразуваме в обект Date:

db.dateParts.aggregate([
  { $match: { _id: 4} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Резултат:

{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $set еквивалент на MongoDb в неговия java драйвер

  2. mongodb c# как да работим с BSON документ

  3. Абсолютна стойност с рамката за агрегиране на MongoDB

  4. Средни агрегирани заявки в Meteor

  5. Може ли mongo да повиши данни от масива?