sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $dateFromParts

I MongoDB er $dateFromParts aggregeringspipeline-operatør konstruerer og returnerer et Date-objekt fra datoens bestanddele.

Du angiver hver datodel som et separat felt.

Du kan angive dine konstituerende datofelter i ISO-ugedatoformat, hvis det kræves.

Eksempel

Antag, at vi har en samling kaldet dateParts med følgende dokument:

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

Dokumentet indeholder et andet felt for hver datodel.

Vi kan køre følgende kode for at returnere et datoobjekt fra felterne i disse dokumenter.

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

Alle dato/tidsdele er blevet konverteret til et enkelt datoobjekt.

Tidszoner

Du kan bruge timezone felt for at angive en tidszone.

Tidszonen kan angives ved hjælp af enten Olsons tidszone-id (f.eks. "Europe/London" , "GMT" ) eller UTC offset (f.eks. "+02:30" , "-1030" ).

Olson Timezone Identifier

Her er et eksempel, der bruger Olson-tidszone-id'er til at udlæse tre forskellige datoer fra et enkelt dokument, baseret på tre forskellige 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

Her er et eksempel, der bruger 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-ugedatoformat

Datodelene kan specificeres ved brug af ISO 8601-formatet, hvis det kræves.

Du kan især bruge:

Formatspecifikation Output
isoWeekYear Årtal i ISO 8601-format. Dette felt er påkrævet, hvis du ikke bruger year (og year er påkrævet, hvis du ikke bruger isoWeekYear ).
isoWeek Årets uge i ISO 8601-format. Kan kun bruges med isoWeekYear .
isoDayOfWeek Ugedag (1-mandag, 7-søndag). Kan kun bruges med isoWeekYear .

Antag, at vi indsætter et andet dokument, der ser sådan ud:

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

Vi kan se, at den bruger isoWeekYear , isoWeek og isoDayOfWeek i stedet for year , month og day (hvilket er hvad det første dokument bruger).

Vi kan bruge følgende kode til at konstruere et Date-objekt ud fra dette 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") } 

Felter uden for rækkevidde

Starter i MongoDB 4.4, det understøttede værdiinterval for year og isoWeekYear er 1-9999 . I tidligere versioner var den nedre grænse for disse værdier 0 og det understøttede værdiinterval var 0-9999 .

Starter i MongoDB 4.0, hvis værdien er angivet for andre felter end year , isoWeekYear og timezone er uden for det gyldige interval, $dateFromParts operatør bærer eller trækker forskellen fra andre datodele for at beregne datoen.

Værdier højere end området

Antag, at vi tilføjer følgende dokument til vores samling:

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

Mange af dato- og tidsfelterne i dette dokument er højere end deres respektive gyldige intervaller.

Lad os køre følgende kommando for at konvertere det til et Dato-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, at datodelene i det resulterende Date-objekt er forskellige fra deres respektive datodele i dokumentet. Dette er fordi $dateFromParts genberegnet datoen for at tage højde for de datodelværdier, der overskred deres normale interval.

Værdier lavere end området

Antag, at vi tilføjer følgende dokument til vores samling:

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

Mange af dato- og tidsfelterne i dette dokument er lavere end deres respektive gyldige intervaller.

Lad os køre følgende kommando for at konvertere det til et Dato-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. Skal jeg afslutte min node redis-klientinstans ved hjælp af .quit()?

  2. Få null pointer-undtagelse Mongo-aggregation ved hjælp af fjederdata (dynamiske felter)

  3. Python og MongoDB:Opretter forbindelse til NoSQL-databaser

  4. 2 måder at slette en samling i MongoDB