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

MongoDB $dateToString

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

$dateToString operátor přijímá datum, časové razítko nebo ObjectId.

Zadáním specifikace formátu můžete určit formát, který se má použít pro výsledek. Specifikace formátu může být libovolný řetězcový literál obsahující 0 nebo více specifikátorů formátu.

Specifikace formátu je volitelná od MongoDB verze 4.0, když featureCompatibilityVersion je nastaven na 4.0 nebo vyšší. Starší verze vyžadují specifikaci formátu.

Volitelně můžete použít timezone parametr k určení časového pásma, které se má použít.

Můžete také použít onNull parametr určující, co se má vrátit, pokud je datum null nebo chybí.

Příklad

Předpokládejme, že máme sbírku nazvanou pets s následujícím dokumentem:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Můžeme spustit následující kód a vrátit řetězec data z born pole v tomto dokumentu.

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
       }
     }
   ]
)

Výsledek:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Tento příklad používá %Y-%m-%dT%H:%M:%S.%LZ jako specifikace formátu. Toto je náhodou výchozí specifikace formátu, ale v tomto případě jsme ji výslovně specifikovali. Vidíme, že řetězec data je vrácen v zadaném formátu.

Zde jsem použil dateString jako název pole, které se má vrátit, ale mohlo to být cokoliv (například formattedDate , theDate atd).

_id pole je vráceno ve výchozím nastavení při použití projekcí v MongoDB, ale v tomto příkladu jsem explicitně skryl _id pole pomocí _id: 0 .

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

Výchozí výstup

Jak již bylo zmíněno, specifikace formátu v předchozím příkladu je výchozí specifikací formátu.

Pokud používáte MongoDB verze 4.0 nebo vyšší, s featureCompatibilityVersion nastavte na 4.0 nebo vyšší (viz, jak zobrazit aktuální featureCompatibilityVersion a jak to nastavit), můžete specifikaci formátu vynechat, pokud chcete, aby bylo datum formátováno pomocí výše uvedeného formátu.

Proto bychom mohli přepsat předchozí. příklad k tomuto:

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          dateString: { $dateToString: { date: "$born" } }
       }
     }
   ]
)

Výsledek:

{ "dateString" : "2020-12-31T23:30:15.123Z" }

Zadejte časové pásmo

Můžete zadat časové pásmo, které se použije pro výstup $dateToString 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.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
       }
     }
   ]
).pretty()

Výsledek:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T12:30"
}

Posun UTC

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

db.pets.aggregate(
   [
     {
       $project: {
         _id: 0,
          UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
          Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
          Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
       }
     }
   ]
).pretty()

Výsledek:

{
	"UTC" : "2020-12-31T23:30",
	"Honolulu" : "2020-12-31T13:30",
	"Auckland" : "2021-01-01T11:30"
}

Formát data týdne podle ISO

Existuje několik specifikátorů formátu, které umožňují výstup řetězce data ve 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 sbírku nazvanou cats s následujícím dokumentem:

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Můžeme spustit následující kód a extrahovat pole data ISO z born pole v tomto dokumentu.

Zde je příklad k demonstraci:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          isoYear: { $dateToString: { format: "%G", date: "$born" } },
          isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
          isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
       }
     }
   ]
)

Výsledek:

{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }

Naproti tomu níže je stejný příklad, ale s použitím částí data týdne, které nejsou ISO.

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          year: { $dateToString: { format: "%Y", date: "$born" } },
          dayofweek: { $dateToString: { format: "%w", date: "$born" } },
          weekofyear: { $dateToString: { format: "%U", date: "$born" } }
       }
     }
   ]
)

Výsledek:

{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }

Vidíme, že výsledek je úplně jiný.

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.

Zde je příklad:

db.pets.aggregate(
   [
     {
       $project: {
          _id: 0,
          dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
       }
     }
   ]
)

Výsledek:

{ "dateString" : "No date supplied" }

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

Vrátí části data z ObjectId

Můžete použít $dateToString vrátit řetězec data z ObjectId.

Hodnoty ObjectId jsou 12bajtové hexadecimální hodnoty, které se skládají z:

  • Čtyřbajtová hodnota časového razítka představující vytvoření ObjectId, měřená v sekundách od epochy Unixu.
  • 5 bajtů je náhodná hodnota
  • 3bajtový inkrementační čítač, inicializovaný na náhodnou hodnotu.

Abychom to shrnuli, náš první dokument vypadá takto:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Tento dokument obsahuje ObjectId. Můžeme tedy použít $dateToString vrátit řetězec data na základě data, kdy byl náš dokument vytvořen (nebo konkrétněji, když _id byla vytvořena hodnota ObjectId pole).

Příklad:

db.pets.aggregate(
   [
     {
       $project: {
          timestamp: { $toDate: "$_id" },
          dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
       }
     }
   ]
).pretty()

Výsledek:

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timestamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateString" : "19-01-2021"
}

V tomto případě jsem se rozhodl vrátit pouze datovou část (nikoli časovou). Také jsem změnil pořadí dnů, měsíců a roku, abych ukázal, že to v případě potřeby určitě můžete udělat.

Také jsem použil $toDate operátor agregačního kanálu, aby vrátil část ObjectId s časovým razítkem.


  1. Porovnání vzorů nasazení pro MongoDB

  2. Redis zápis do .ssh/authorized_keys

  3. Platnost Mongoose vyprší majetek, který nefunguje správně

  4. Mac(os x):Existuje způsob, jak nainstalovat POUZE redis-cli?