sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $dateFromString

I MongoDB, $dateFromString aggregeringspipeline-operatorn konverterar en datum-/tidssträng till ett datumobjekt.

Exempel

Anta att vi har en samling som heter foo med följande dokument:

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

Alla dokument innehåller en datum-/tidssträng.

Vi kan köra följande kod för att returnera ett datumobjekt från bar fält i dessa dokument.

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

Alla datum-/tidssträngar har konverterats till ett datumobjekt.

Jag har också ändrat fältnamnet från bar till date .

Ange ett format

Du kan ange ett valfritt format argument för att ange formatet för datum-/tidssträngen som tillhandahålls. Formatspecifikationen kan vara vilken sträng som helst och innehålla 0 eller fler formatspecifikationer.

format parametern är tillgänglig från MongoDB version 4.0.

Standardformatet är %Y-%m-%dT%H:%M:%S.%LZ , vilket är vad det tidigare exemplet använder.

Anta att vi infogar följande dokument i vår samling:

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

I det här fallet kan datumet vara den 7:e dagen i den 8:e månaden eller den 8:e dagen i den 7:e månaden, beroende på vilket språk som används.

Vi kan använda en formatspecifikation för att specificera exakt vilken det ska vara.

Exempel:

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 det här fallet angav vi att det är den 8:e dagen i den 7:e månaden.

Här är den igen, men den här gången byter vi dag och månad.

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

Den här gången tolkas det som den 7:e dagen i den 8:e månaden.

Se MongoDB $dateFromString Formatspecifikationer för en lista över giltiga formatspecifikationer.

ISO-veckodatumformat

Det finns några formatspecifikationer som gör att du kan ange datum med ISO 8601-format.

I synnerhet kan du använda:

Formatspecifikation Utdata
%G Årtal i ISO 8601-format
%u Veckodagnummer i ISO 8601-format (1-måndag, 7-söndag)
%V Årets vecka i ISO 8601-format

Anta att vi har ett dokument som ser ut så här:

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

Vi skulle kunna tolka det datumet som den 7:e dagen i ISO-veckan, följt av den 8:e ISO-veckan på året, följt av året.

Så här:

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

Ange en tidszon

Du kan ange en tidszon som ska användas med $dateFromString operatör.

Tidszonen kan specificeras med antingen Olsons tidszonsidentifierare (t.ex. "Europe/London" , "GMT" ) eller UTC-offset (t.ex. "+02:30" , "-1030" ).

Olsons tidszonsidentifierare

Här är ett exempel som matar ut datumsträngen i tre olika tidszoner, var och en med Olsons tidszons-ID:

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

Här är ett exempel som använder 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")
}

Om du använder timezone kan datumsträngen inte läggas till med ett Z för att indikera Zulu-tid (UTC-tidszon). Till exempel kan datumsträngen inte vara 2020-12-31T23:30:25.123Z när du använder tidszonsparametern.

Inkludera inte heller tidszonsinformation i datumsträngen när du använder tidszonsparametern.

onNull Parameter

onNull parameter kan användas för att ange vad som ska returneras om datumet är null eller inte existerar.

Värdet som tillhandahålls till onNull parameter kan vara vilket giltigt uttryck som helst.

Anta att vi har ett dokument som detta:

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

Vi skulle kunna använda onNull på följande sätt:

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 det här fallet var datumet null och så inkluderar utdatadokumentet strängen som jag angav för onNull parameter.

onError Parameter

Du kan valfritt använda onError parameter för att tillhandahålla ett uttryck för utmatning i händelse av att ett fel inträffar.

Anta att vår samling innehåller följande dokument:

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

Även om det finns ett datum i bar fältet är det inte en giltig datum-/tidssträng, och det kommer därför att orsaka ett fel om vi använder dateFromString för att försöka konvertera det till ett datumobjekt.

Exempel på fel:

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 är ett otäckt utseendefel.

Vi kan använda onError parameter för att få det att se snyggare ut:

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 och onError parametrar gör att vi kan returnera de faktiska dokumenten, de tillåter oss att returnera flera dokument utan att behöva oroa oss för att ett dåligt dokument stoppar hela operationen.

Exempel:

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. Felsökning av ett MongoDB Sharded Cluster

  2. Hur man bygger en URL Shortener med Node.js och MongoDB

  3. Så här löser du MongoError:pool förstördes när du ansluter till CosmosDB

  4. MongoDB elemmatchar flera element i array