In MongoDB is de $dateFromString
aggregatiepijplijnoperator converteert een datum/tijd-tekenreeks naar een datumobject.
Voorbeeld
Stel dat we een verzameling hebben met de naam foo
met de volgende documenten:
{ "_id" : 1, "bar" : "2020-12-31T23:30:25.123" } { "_id" : 2, "bar" : "2020-12-31" } { "_id" : 3, "bar" : "2020-12-31T23:30" }
Alle documenten bevatten een datum/tijd-string.
We kunnen de volgende code uitvoeren om een datumobject van de bar
te retourneren velden in die documenten.
db.foo.aggregate([
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Resultaat:
{ "_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 datum/tijd-strings zijn geconverteerd naar een datumobject.
Ik heb ook de veldnaam veranderd van bar
tot date
.
Geef een formaat op
U kunt een optioneel format
opgeven argument om het formaat op te geven van de datum/tijd-tekenreeks die wordt verstrekt. De formaatspecificatie kan elke letterlijke tekenreeks zijn, die 0 of meer formaatspecificaties bevat.
Het format
parameter is beschikbaar vanaf MongoDB versie 4.0.
Het standaardformaat is %Y-%m-%dT%H:%M:%S.%LZ
, dat is wat het vorige voorbeeld gebruikt.
Stel dat we het volgende document in onze collectie opnemen:
{ "_id" : 4, "bar" : "07/08/2020" }
In dit geval kan de datum de 7e dag van de 8e maand zijn, of de 8e dag van de 7e maand, afhankelijk van de landinstelling die wordt gebruikt.
We kunnen een formaatspecificatie gebruiken om precies aan te geven welke het moet zijn.
Voorbeeld:
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%m/%d/%Y"
}
}
}
}
])
Resultaat:
{ "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
In dit geval hebben we aangegeven dat dit de 8e dag van de 7e maand is.
Hier is het weer, maar deze keer wisselen we de dag en de maand om.
db.foo.aggregate([
{ $match: { _id: 4 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%d/%m/%Y"
}
}
}
}
])
Resultaat:
{ "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }
Deze keer wordt het geïnterpreteerd als de 7e dag van de 8e maand.
Zie MongoDB $dateFromString
Formaatspecificaties voor een lijst met geldige formaatspecificaties.
ISO-weekdatumnotatie
Er zijn een paar formaatspecificaties waarmee u datums kunt specificeren met behulp van de ISO 8601-indeling.
U kunt in het bijzonder gebruik maken van:
Formaatspecificatie | Uitvoer |
---|---|
%G | Jaar in ISO 8601-formaat |
%u | Dag van de week in ISO 8601-formaat (1-maandag, 7-zondag) |
%V | Week van het jaar in ISO 8601-formaat |
Stel dat we een document hebben dat er als volgt uitziet:
{ "_id" : 5, "bar" : "7-8-2020" }
We zouden die datum kunnen interpreteren als de 7e dag van de ISO-week, gevolgd door de 8e ISO-week van het jaar, gevolgd door het jaar.
Zoals dit:
db.foo.aggregate([
{ $match: { _id: 5 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
format: "%u-%V-%G"
}
}
}
}
])
Resultaat:
{ "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }
Geef een tijdzone op
U kunt een tijdzone specificeren om te gebruiken met de $dateFromString
telefoniste.
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 de datumreeks in drie verschillende tijdzones uitvoert, elk met de Olson-tijdzone-ID's:
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()
Resultaat:
{ "_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
Hier is een voorbeeld dat de UTC-offset gebruikt.
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()
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") }
Als u de timezone
. gebruikt parameter kan de datumreeks niet worden toegevoegd met een Z om de Zulu-tijd (UTC-tijdzone) aan te geven. De datumreeks mag bijvoorbeeld niet 2020-12-31T23:30:25.123Z
zijn bij gebruik van de tijdzoneparameter.
Neem ook geen tijdzone-informatie op in de datumreeks wanneer u de tijdzoneparameter gebruikt.
De onNull
Parameter
De onNull
parameter kan worden gebruikt om aan te geven wat moet worden geretourneerd als de datum null is of niet bestaat.
De waarde die is opgegeven voor de onNull
parameter kan elke geldige uitdrukking zijn.
Stel dat we een document hebben zoals dit:
{ "_id" : 6, "bar" : null }
We zouden onNull
. kunnen gebruiken op de volgende manier:
db.foo.aggregate([
{ $match: { _id: 6 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onNull: "No valid date was supplied"
}
}
}
}
])
Resultaat:
{ "_id" : 6, "date" : "No valid date was supplied" }
In dit geval was de datum null
en dus bevat het uitvoerdocument de tekenreeks die ik heb opgegeven voor de onNull
parameter.
De onError
Parameter
U kunt optioneel de onError
. gebruiken parameter om een expressie te leveren voor het geval er een fout optreedt.
Stel dat onze collectie het volgende document bevat:
{ "_id" : 7, "bar" : "21st Dec, 2030" }
Ook al staat er een datum in de bar
veld, het is geen geldige datum/tijd-tekenreeks en zal daarom een fout veroorzaken als we dateFromString
gebruiken om te proberen het te converteren naar een datumobject.
Voorbeeld van een fout:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar'
}
}
}
}
])
Resultaat:
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
Dat is een vervelende fout.
We kunnen de onError
. gebruiken parameter om het er mooier uit te laten zien:
db.foo.aggregate([
{ $match: { _id: 7 } },
{
$project: {
date: {
$dateFromString: {
dateString: '$bar',
onError: "An error occurred while parsing the date string"
}
}
}
}
])
Resultaat:
{ "_id" : 7, "date" : "An error occurred while parsing the date string" }
Gezien als de onNull
en onError
parameters stellen ons in staat om de eigenlijke documenten terug te sturen, ze stellen ons in staat om meerdere documenten terug te sturen, zonder ons zorgen te maken dat één slecht document de hele operatie stopt.
Voorbeeld:
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"
}
}
}
}
])
Resultaat:
{ "_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" }