sql >> Database >  >> NoSQL >> MongoDB

MongoDB $dateFromString

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


  1. Automatisch verwijzende objecten verwijderen bij verwijdering in MongoDB

  2. MongoDB findAndModify()

  3. redis:back-up dump.rdb

  4. Hoe controleer ik of redis actief is voordat ik flask start (en start het als dit niet het geval is)?