sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $dateToString

I MongoDB er $dateToString aggregeringspipeline-operator konverterer et givet datoobjekt til en streng.

$dateToString operatøren accepterer enten en dato, et tidsstempel eller et objekt-id.

Du kan angive et format, der skal bruges til resultatet, ved at angive en formatspecifikation. Formatspecifikationen kan være en hvilken som helst streng literal, indeholdende 0 eller flere formatspecifikationer.

Formatspecifikationen er valgfri fra MongoDB version 4.0, når featureCompatibilityVersion er indstillet til 4.0 eller højere. Tidligere versioner kræver formatspecifikationen.

Du kan valgfrit bruge timezone parameter for at angive den tidszone, der skal bruges.

Du kan også bruge onNull parameter for at angive, hvad der skal returneres, hvis datoen er null eller mangler.

Eksempel

Antag, at vi har en samling kaldet pets med følgende dokument:

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

Vi kan køre følgende kode for at returnere en datostreng fra born felt i det pågældende dokument.

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

Resultat:

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

Dette eksempel bruger %Y-%m-%dT%H:%M:%S.%LZ som formatspecifikation. Dette er tilfældigvis standardformatspecifikationen, men i dette tilfælde specificerede vi det eksplicit. Vi kan se, at datostrengen returneres i det angivne format.

Her brugte jeg dateString som feltnavnet, der skal returneres, men dette kunne have været hvad som helst (såsom formattedDate , theDate etc).

_id felt returneres som standard ved brug af projektioner i MongoDB, men i dette eksempel skjulte jeg eksplicit _id felt ved hjælp af _id: 0 .

Se MongoDB $dateToString Formatspecifikationer for en liste over tilgængelige formatspecifikationer.

Standardoutput

Som nævnt er formatspecifikationen i det foregående eksempel standardformatspecifikationen.

Hvis du bruger MongoDB version 4.0 eller nyere, med featureCompatibilityVersion indstillet til 4.0 eller højere (se, hvordan du får vist din nuværende featureCompatibilityVersion og hvordan du indstiller det), kan du udelade formatspecifikationen, hvis du ønsker, at datoen skal formateres med ovenstående format.

Derfor kunne vi omskrive det forrige. eksempel på dette:

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

Resultat:

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

Angiv en tidszone

Du kan angive en tidszone, der skal bruges til output af $dateToString operatør.

Tidszonen kan angives ved hjælp af enten Olsons tidszone-id (f.eks. "Europe/London" , "GMT" ) eller UTC offset (f.eks. "+02:30" , "-1030" ).

Olson Timezone Identifier

Her er et eksempel, der udsender datostrengen i tre forskellige tidszoner, hver ved hjælp af Olsons tidszone-id'er:

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

Resultat:

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

UTC offset

Her er et eksempel, der bruger UTC-offset.

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

Resultat:

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

ISO-ugedatoformat

Der er et par formatspecifikationer, der gør det muligt for dig at udskrive datostrengen ved hjælp af ISO 8601-formatet.

Du kan især bruge:

Formatspecifikation Output
%G Årtal i ISO 8601-format
%u Ugedagnummer i ISO 8601-format (1-mandag, 7-søndag)
%V Årets uge i ISO 8601-format

Antag, at vi har en samling kaldet cats med følgende dokument:

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

Vi kan køre følgende kode for at udtrække ISO-datofelterne fra born felt i det pågældende dokument.

Her er et eksempel til demonstration:

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

Resultat:

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

I modsætning hertil er det samme eksempel nedenfor, men ved at bruge de ikke-ISO-ugedatodele.

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

Resultat:

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

Vi kan se, at resultatet er et helt andet.

onNull Parameter

onNull parameter kan bruges til at angive, hvad der skal returneres, hvis datoen er nul eller ikke eksisterer.

Værdien givet til onNull parameter kan være et hvilket som helst gyldigt udtryk.

Her er et eksempel:

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

Resultat:

{ "dateString" : "No date supplied" }

I dette tilfælde var datoen null og så inkluderer outputdokumentet den streng, som jeg har angivet for onNull parameter.

Returner datodelene fra et objekt-id

Du kan bruge $dateToString for at returnere en datostreng fra et ObjectId.

ObjectId-værdier er 12 byte hexadecimale værdier, der består af:

  • En tidsstempelværdi på 4 byte, der repræsenterer objekt-id'ets oprettelse, målt i sekunder siden Unix-epoken.
  • En 5 byte er en tilfældig værdi
  • En 3 byte-tæller, initialiseret til en tilfældig værdi.

For at opsummere ser vores første dokument sådan ud:

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

Dette dokument indeholder et ObjectId. Vi kan derfor bruge $dateToString for at returnere en datostreng baseret på den dato, vores dokument blev oprettet (eller mere specifikt, når _id feltets ObjectId-værdi blev oprettet).

Eksempel:

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

Resultat:

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

I dette tilfælde besluttede jeg at returnere kun datodelen (ikke tidsdelen). Jeg ændrede også rækkefølgen af ​​dage, måneder og år for at vise, at du bestemt kan gøre dette, hvis det kræves.

Jeg brugte også $toDate aggregeringspipeline-operatør for at returnere tidsstempeldelen af ​​ObjectId.


  1. 5 måder at vælge rækker med minimumsværdien for deres gruppe i SQL

  2. Genbruger MongoDB slettet plads?

  3. Hvordan bruger man MongoDB med løfter i Node.js?

  4. Højtydende MongoDB-klynger på Amazon EC2