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

MongoDB $dateFromString

I MongoDB er $dateFromString aggregeringspipeline-operator konverterer en dato/tidsstreng til et datoobjekt.

Eksempel

Antag, at vi har en samling kaldet foo med følgende dokumenter:

{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" }
{ "_id" : 2, "bar" : "2020-12-31" }
{ "_id" : 3, "bar" : "2020-12-31T23:30" }

Alle dokumenter indeholder en dato-/tidsstreng.

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

db.foo.aggregate([ 
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar'
          }
        }
    }
  } 
])

Resultat:

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

Alle dato/tidsstrenge er blevet konverteret til et datoobjekt.

Jeg har også ændret feltnavnet fra bar til date .

Angiv et format

Du kan angive et valgfrit format argument for at specificere formatet på den dato/klokkeslæt streng, der leveres. Formatspecifikationen kan være en hvilken som helst streng literal, indeholdende 0 eller flere formatspecifikationer.

format parameter er tilgængelig fra MongoDB version 4.0.

Standardformatet er %Y-%m-%dT%H:%M:%S.%LZ , hvilket er hvad det foregående eksempel bruger.

Antag, at vi indsætter følgende dokument i vores samling:

{ "_id" : 4, "bar" : "07/08/2020" }

I dette tilfælde kan datoen være den 7. dag i den 8. måned eller den 8. dag i den 7. måned, afhængigt af den anvendte lokalitet.

Vi kan bruge en formatspecifikation til at specificere præcis hvilken det skal være.

Eksempel:

db.foo.aggregate([ 
  { $match: { _id: 4 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%m/%d/%Y"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }

I dette tilfælde har vi specificeret, at det er den 8. dag i den 7. måned.

Her er den igen, men denne gang bytter vi dag og måned rundt.

db.foo.aggregate([ 
  { $match: { _id: 4 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%d/%m/%Y"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }

Denne gang tolkes det som den 7. dag i den 8. måned.

Se MongoDB $dateFromString Formatspecifikationer for en liste over gyldige formatspecifikationer.

ISO-ugedatoformat

Der er et par formatspecifikationer, der gør det muligt for dig at angive datoer ved hjælp af ISO 8601-format.

Du kan især bruge:

Formatspecifikation Output
%G Årtal i ISO 8601-format
%u Ugedagnummer i ISO 8601-format (1-mandag, 7-søndag)
%V Årets uge i ISO 8601-format

Antag, at vi har et dokument, der ser sådan ud:

{ "_id" : 5, "bar" : "7-8-2020" }

Vi kunne fortolke denne dato som værende den 7. dag i ISO-ugen, efterfulgt af den 8. ISO-uge i året, efterfulgt af året.

Sådan:

db.foo.aggregate([ 
  { $match: { _id: 5 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              format: "%u-%V-%G"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }

Angiv en tidszone

Du kan angive en tidszone, der skal bruges med $dateFromString operatør.

Tidszonen kan specificeres ved at bruge 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 udsender datostrengen i tre forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:

db.foo.aggregate([ 
  { $match: { _id: 1 } },
  {
    $project: {
        utc: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "UTC"
          }
        },
        honolulu: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "Pacific/Honolulu"
          }
        },
        auckland: {
          $dateFromString: {
              dateString: '$bar',
              timezone: "Pacific/Auckland"
          }
        }
    }
  } 
]).pretty()

Resultat:

{
	"_id" : 1,
	"utc" : ISODate("2020-12-31T23:30:25.123Z"),
	"honolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"auckland" : ISODate("2020-12-31T10:30:25.123Z")
}

UTC offset

Her er et eksempel, der bruger UTC-offset.

db.foo.aggregate([ 
  { $match: { _id: 1 } },
  {
    $project: {
        "date+00:00": {
          $dateFromString: {
              dateString: '$bar',
              timezone: "+00:00"
          }
        },
        "date-10:00": {
          $dateFromString: {
              dateString: '$bar',
              timezone: "-10:00"
          }
        },
        "date+12:00": {
          $dateFromString: {
              dateString: '$bar',
              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")
}

Hvis du bruger timezone parameter, kan datostrengen ikke tilføjes et Z for at angive Zulu-tid (UTC-tidszone). For eksempel kan datostrengen ikke være 2020-12-31T23:30:25.123Z når du bruger tidszoneparameteren.

Medtag heller ikke tidszoneoplysninger i datostrengen, når du bruger tidszoneparameteren.

onNull Parameter

onNull parameter kan bruges til at angive, hvad der skal returneres, hvis datoen er nul eller ikke eksisterer.

Værdien givet til onNull parameter kan være et hvilket som helst gyldigt udtryk.

Antag, at vi har et dokument som dette:

{ "_id" : 6, "bar" : null }

Vi kunne bruge onNull på følgende måde:

db.foo.aggregate([ 
  { $match: { _id: 6 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onNull: "No valid date was supplied"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 6, "date" : "No valid date was supplied" }

I dette tilfælde var datoen null og så inkluderer outputdokumentet den streng, som jeg har angivet for onNull parameter.

onError Parameter

Du kan valgfrit bruge onError parameter for at give et udtryk til output i tilfælde af, at der opstår en fejl.

Antag, at vores samling indeholder følgende dokument:

{ "_id" : 7, "bar" : "21st Dec, 2030" }

Selvom der er en dato i bar felt, er det ikke en gyldig dato/tidsstreng, og det vil derfor forårsage en fejl, hvis vi bruger dateFromString for at prøve at konvertere det til et datoobjekt.

Eksempel på fejl:

db.foo.aggregate([ 
  { $match: { _id: 7 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar'
          }
        }
    }
  } 
])

Resultat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"",
	"code" : 241,
	"codeName" : "ConversionFailure"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Det er en grim fejl.

Vi kan bruge onError parameter for at få det til at se pænere ud:

db.foo.aggregate([ 
  { $match: { _id: 7 } },
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onError: "An error occurred while parsing the date string"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 7, "date" : "An error occurred while parsing the date string" }

Ses som onNull og onError parametre giver os mulighed for at returnere de faktiske dokumenter, de giver os mulighed for at returnere flere dokumenter uden at bekymre os om, at et dårligt dokument stopper hele operationen.

Eksempel:

db.foo.aggregate([ 
  {
    $project: {
        date: {
          $dateFromString: {
              dateString: '$bar',
              onNull: "The date was either empty or null",
              onError: "An error occurred while parsing the date string"
          }
        }
    }
  } 
])

Resultat:

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
{ "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") }
{ "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
{ "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") }
{ "_id" : 6, "date" : "The date was either empty or null" }
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }


  1. Oprettelse af et udenlandsk nøgleforhold i Mongoose

  2. mongodb:forespørgsel efter tidsperioden mellem to datofelter

  3. Betinget gruppering med $ findes inde i $cond

  4. Multipel brug af positionsoperatoren `$` til at opdatere indlejrede arrays