sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $dateFromString

V MongoDB, $dateFromString operátor agregačního kanálu převede řetězec data/času na objekt data.

Příklad

Předpokládejme, že máme kolekci nazvanou foo s následujícími dokumenty:

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

Všechny dokumenty obsahují řetězec data/času.

Můžeme spustit následující kód a vrátit objekt data z bar pole v těchto dokumentech.

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

Výsledek:

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

Všechny řetězce data/času byly převedeny na objekt data.

Také jsem změnil název pole z bar do date .

Zadejte formát

Můžete zadat volitelný format argument k určení formátu řetězce data/času, který je poskytnut. Specifikace formátu může být libovolný řetězcový literál obsahující 0 nebo více specifikátorů formátu.

format parametr je dostupný od MongoDB verze 4.0.

Výchozí formát je %Y-%m-%dT%H:%M:%S.%LZ , což je to, co používá předchozí příklad.

Předpokládejme, že do naší sbírky vložíme následující dokument:

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

V tomto případě může být datem 7. den 8. měsíce nebo 8. den 7. měsíce v závislosti na používaném národním prostředí.

Můžeme použít specifikaci formátu, abychom přesně určili, který by to měl být.

Příklad:

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

Výsledek:

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

V tomto případě jsme uvedli, že se jedná o 8. den 7. měsíce.

Je to tu znovu, ale tentokrát jsme si vyměnili den a měsíc.

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

Výsledek:

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

Tentokrát je to interpretováno jako 7. den 8. měsíce.

Viz MongoDB $dateFromString Specifikátory formátu pro seznam platných specifikátorů formátu.

Formát data týdne podle ISO

Existuje několik specifikátorů formátu, které vám umožňují určit data pomocí formátu ISO 8601.

Konkrétně můžete použít:

Specifikátor formátu Výstup
%G Rok ve formátu ISO 8601
%u Číslo dne v týdnu ve formátu ISO 8601 (1–pondělí, 7–neděle)
%V Týden roku ve formátu ISO 8601

Předpokládejme, že máme dokument, který vypadá takto:

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

Toto datum bychom mohli interpretovat jako 7. den v týdnu ISO, po kterém následuje 8. týden ISO v roce a po něm rok.

Takhle:

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

Výsledek:

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

Zadejte časové pásmo

Pomocí $dateFromString můžete zadat časové pásmo, které se má použít operátor.

Časové pásmo lze zadat buď pomocí identifikátoru časového pásma Olson (např. "Europe/London" , "GMT" ) nebo offset UTC (např. "+02:30" , "-1030" ).

Olsonův identifikátor časového pásma

Zde je příklad, jehož výstupem je řetězec data ve třech různých časových pásmech, z nichž každé používá ID časového pásma Olson:

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

Výsledek:

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

Posun UTC

Zde je příklad, který používá offset UTC.

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

Výsledek:

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

Pokud používáte timezone parametr, nelze k datovému řetězci připojit Z pro označení Zuluského času (časové pásmo UTC). Řetězec data například nemůže být 2020-12-31T23:30:25.123Z při použití parametru časové pásmo.

Při použití parametru timezone také do řetězce data nezahrnujte informace o časovém pásmu.

onNull Parametr

onNull Parametr lze použít k určení toho, co se má vrátit, pokud je datum prázdné nebo neexistuje.

Hodnota poskytnutá parametru onNull parametr může být libovolný platný výraz.

Předpokládejme, že máme dokument jako tento:

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

Mohli bychom použít onNull následujícím způsobem:

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

Výsledek:

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

V tomto případě bylo datum null a tak výstupní dokument obsahuje řetězec, který jsem poskytl pro onNull parametr.

onError Parametr

Volitelně můžete použít onError parametr pro poskytnutí výrazu pro výstup v případě, že dojde k chybě.

Předpokládejme, že naše sbírka obsahuje následující dokument:

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

I když je v bar datum pole, není to platný řetězec data/času, a proto způsobí chybu, pokud použijeme dateFromString pokusit se jej převést na objekt data.

Příklad chyby:

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

Výsledek:

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

To je ošklivá chyba.

Můžeme použít onError parametr, aby to vypadalo lépe:

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

Výsledek:

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

Vidět jako onNull a onError parametry nám umožňují vrátit skutečné dokumenty, umožňují nám vrátit více dokumentů, aniž bychom se museli obávat, že jeden špatný dokument zastaví celou operaci.

Příklad:

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

Výsledek:

{ "_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. Odstranění konkrétních položek z pole pomocí MongoDB

  2. MongoDB Nahradit konkrétní hodnoty pole

  3. Objekt kolekce není volatelná chyba s PyMongo

  4. Jak zastavit sestavení Runaway Index v MongoDB