sql >> Database >  >> NoSQL >> MongoDB

MongoDB $dateFromParts

In MongoDB, de $dateFromParts aggregatiepijplijnoperator construeert en retourneert een Date-object uit de samenstellende delen van de datum.

U geeft elk datumgedeelte op als een apart veld.

Indien nodig kunt u uw samenstellende datumvelden specificeren in ISO-weekdatumformaat.

Voorbeeld

Stel dat we een verzameling hebben met de naam dateParts met het volgende document:

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

Het document bevat voor elk datumgedeelte een ander veld.

We kunnen de volgende code uitvoeren om een ​​datumobject uit de velden in die documenten te retourneren.

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

Resultaat:

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

Alle datum-/tijddelen zijn geconverteerd naar een enkel datumobject.

Tijdzones

U kunt de timezone . gebruiken veld om een ​​tijdzone op te geven.

De tijdzone kan worden opgegeven met behulp van de Olson-tijdzone-ID (bijv. "Europe/London" , "GMT" ) of de UTC-offset (bijv. "+02:30" , "-1030" ).

Olson tijdzone-ID

Hier is een voorbeeld dat Olson-tijdzone-ID's gebruikt om drie verschillende datums uit een enkel document uit te voeren, gebaseerd op drie verschillende tijdzones.

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

Resultaat:

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

Hier is een voorbeeld dat de UTC-offset gebruikt.

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

Resultaat:

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

De datumdelen kunnen indien nodig worden gespecificeerd met behulp van het ISO 8601-formaat.

U kunt in het bijzonder gebruik maken van:

Formaatspecificatie Uitvoer
isoWeekYear Jaar in ISO 8601-formaat. Dit veld is verplicht als year niet wordt gebruikt (en year is vereist als isoWeekYear . niet wordt gebruikt ).
isoWeek Week van het jaar in ISO 8601-formaat. Kan alleen worden gebruikt met isoWeekYear .
isoDayOfWeek Dag van de week (1-maandag, 7-zondag). Kan alleen worden gebruikt met isoWeekYear .

Stel dat we een tweede document invoegen dat er als volgt uitziet:

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

We kunnen zien dat het isoWeekYear . gebruikt , isoWeek , en isoDayOfWeek in plaats van year , month , en day (wat het eerste document gebruikt).

We kunnen de volgende code gebruiken om een ​​Date-object uit dit document te construeren:

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

Resultaat:

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

Buiten bereik velden

Vanaf MongoDB 4.4, het ondersteunde waardebereik voor year en isoWeekYear is 1-9999 . In eerdere versies was de ondergrens voor deze waarden 0 en het ondersteunde waardebereik was 0-9999 .

Vanaf MongoDB 4.0, als de waarde gespecificeerd voor andere velden dan year , isoWeekYear , en timezone buiten het geldige bereik valt, de $dateFromParts operator draagt ​​het verschil bij of trekt het af van andere datumdelen om de datum te berekenen.

Waarden hoger dan het bereik

Stel dat we het volgende document aan onze collectie toevoegen:

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

Veel van de datum- en tijdvelden in dit document zijn hoger dan hun respectievelijke geldige bereiken.

Laten we de volgende opdracht uitvoeren om het om te zetten in een Date-object:

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

Resultaat:

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

We kunnen zien dat de datumdelen in het resulterende Date-object verschillen van hun respectievelijke datumdelen in het document. Dit komt omdat $dateFromParts herberekend de datum om rekening te houden met de datumdeelwaarden die hun normale bereik overschreden.

Waarden lager dan het bereik

Stel dat we het volgende document aan onze collectie toevoegen:

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

Veel van de datum- en tijdvelden in dit document zijn lager dan hun respectievelijke geldige bereiken.

Laten we de volgende opdracht uitvoeren om het om te zetten in een Date-object:

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

Resultaat:

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

  1. MongoDB-prestaties volgen?

  2. Zoek een document met ObjectID in mongoDB

  3. Spring Redis - Configuratie lezen uit bestand application.properties

  4. Node.js, Socket.io, Redis pub/sub hoog volume, lage latentieproblemen