sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $dateFromParts

I MongoDB, $dateFromParts aggregeringspipeline-operatör konstruerar och returnerar ett Date-objekt från datumets beståndsdelar.

Du anger varje datumdel som ett separat fält.

Du kan ange dina ingående datumfält i ISO-veckodatumformat om det behövs.

Exempel

Anta att vi har en samling som heter dateParts med följande dokument:

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

Dokumentet innehåller olika fält för varje datumdel.

Vi kan köra följande kod för att returnera ett datumobjekt från fälten i dessa dokument.

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

Resultat:

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

Alla datum/tidsdelar har konverterats till ett enda datumobjekt.

Tidszoner

Du kan använda timezone fältet för att ange en tidszon.

Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London" , "GMT" ) eller UTC-offset (t.ex. "+02:30" , "-1030" ).

Olsons tidszonsidentifierare

Här är ett exempel som använder Olsons tidszons-ID för att mata ut tre olika datum från ett enda dokument, baserat på tre olika tidszoner.

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()

Resultat:

{
	"_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-offset

Här är ett exempel som använder UTC-offset.

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()

Resultat:

{
	"_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-veckodatumformat

Datumdelarna kan specificeras med ISO 8601-formatet vid behov.

I synnerhet kan du använda:

Formatspecifikation Utdata
isoWeekYear Årtal i ISO 8601-format. Detta fält är obligatoriskt om du inte använder year (och year krävs om du inte använder isoWeekYear ).
isoWeek Årets vecka i ISO 8601-format. Kan endast användas med isoWeekYear .
isoDayOfWeek Veckodag (1-måndag, 7-söndag). Kan endast användas med isoWeekYear .

Anta att vi infogar ett andra dokument som ser ut så här:

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

Vi kan se att den använder isoWeekYear , isoWeek och isoDayOfWeek istället för year , month och day (vilket är vad det första dokumentet använder).

Vi kan använda följande kod för att konstruera ett Date-objekt från detta dokument:

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"
          }
        }
    }
  }
])

Resultat:

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

Fält utanför intervallet

Från och med MongoDB 4.4, det värdeintervall som stöds för year och isoWeekYear är 1-9999 . I tidigare versioner var den nedre gränsen för dessa värden 0 och det värdeintervall som stöds var 0-9999 .

Från och med MongoDB 4.0, om värdet anges för andra fält än year , isoWeekYear och timezone är utanför det giltiga intervallet, $dateFromParts operatören bär eller subtraherar skillnaden från andra datumdelar för att beräkna datumet.

Värden högre än intervallet

Anta att vi lägger till följande dokument i vår samling:

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

Många av datum- och tidsfälten i detta dokument är högre än deras respektive giltiga intervall.

Låt oss köra följande kommando för att konvertera det till ett Date-objekt:

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

Resultat:

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

Vi kan se att datumdelarna i det resulterande Date-objektet skiljer sig från deras respektive datumdelar i dokumentet. Detta beror på att $dateFromParts räknade om datumet för att ta hänsyn till datumdelvärdena som överskred deras normala intervall.

Värden lägre än intervallet

Anta att vi lägger till följande dokument i vår samling:

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

Många av datum- och tidsfälten i detta dokument är lägre än deras respektive giltiga intervall.

Låt oss köra följande kommando för att konvertera det till ett Date-objekt:

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

Resultat:

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

  1. Anpassad deserialisering

  2. Hur man konfigurerar MongoDb-samlingens namn för en klass i Spring Data

  3. MongoDB $in Query Operator

  4. Hitta nycklar med jokertecken