sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $dateToString

I MongoDB, $dateToString aggregeringspipeline-operatör konverterar ett givet datumobjekt till en sträng.

$dateToString operatören accepterar antingen ett datum, en tidsstämpel eller ett objekt-ID.

Du kan ange ett format som ska användas för resultatet genom att tillhandahålla en formatspecifikation. Formatspecifikationen kan vara vilken sträng som helst och innehålla 0 eller fler formatspecifikationer.

Formatspecifikationen är valfri från MongoDB version 4.0, när featureCompatibilityVersion är inställd på 4.0 eller högre. Tidigare versioner kräver formatspecifikationen.

Du kan valfritt använda timezone parameter för att ange den tidszon som ska användas.

Du kan också använda onNull parameter för att ange vad som ska returneras om datumet är null eller saknas.

Exempel

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

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

Vi kan köra följande kod för att returnera en datumsträng från born fältet i det dokumentet.

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

Det här exemplet använder %Y-%m-%dT%H:%M:%S.%LZ som formatspecifikation. Detta råkar vara standardformatspecifikationen, men i det här fallet angav vi det uttryckligen. Vi kan se att datumsträngen returneras med det angivna formatet.

Här använde jag dateString som fältnamnet att returnera, men detta kan ha varit vad som helst (som formattedDate , theDate etc).

_id fältet returneras som standard när man använder projektioner i MongoDB, men i det här exemplet gömde jag uttryckligen _id fält med _id: 0 .

Se MongoDB $dateToString Formatspecifikationer för en lista över tillgängliga formatspecifikationer.

Standardutgång

Som nämnts är formatspecifikationen i föregående exempel standardformatspecifikationen.

Om du använder MongoDB version 4.0 eller senare, med featureCompatibilityVersion inställd på 4.0 eller högre (se hur du visar din nuvarande featureCompatibilityVersion och hur man ställer in det), kan du utelämna formatspecifikationen om du vill att datumet ska formateras med formatet ovan.

Därför kunde vi skriva om det föregående. exempel på detta:

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

Resultat:

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

Ange en tidszon

Du kan ange en tidszon som ska användas för utmatningen av $dateToString 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.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

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

Det finns några formatspecifikationer som gör att du kan mata ut datumsträngen med ISO 8601-formatet.

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 en samling som heter cats med följande dokument:

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

Vi kan köra följande kod för att extrahera ISO-datumfälten från born fältet i det dokumentet.

Här är ett exempel att visa:

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

Däremot nedan är samma exempel, men med veckodatum som inte är 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" } }
       }
     }
   ]
)

Resultat:

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

Vi kan se att resultatet är ett helt annat.

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.

Här är ett exempel:

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

Resultat:

{ "dateString" : "No date supplied" }

I det här fallet var datumet null och så inkluderar utdatadokumentet strängen som jag angav för onNull parameter.

Returnera datumdelarna från ett objekt-ID

Du kan använda $dateToString för att returnera en datumsträng från ett ObjectId.

ObjectId-värden är hexadecimala värden på 12 byte som består av:

  • Ett tidsstämpelvärde på 4 byte, som representerar objekt-ID:ts skapelse, mätt i sekunder sedan Unix-epoken.
  • En 5 byte är ett slumpmässigt värde
  • En 3-byte inkrementerande räknare, initierad till ett slumpmässigt värde.

För att sammanfatta ser vårt första dokument ut så här:

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

Detta dokument innehåller ett ObjectId. Vi kan därför använda $dateToString för att returnera en datumsträng, baserat på det datum då vårt dokument skapades (eller mer specifikt, när _id fältets ObjectId-värde skapades).

Exempel:

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 det här fallet bestämde jag mig för att bara returnera datumdelen (inte tidsdelen). Jag ändrade också ordningen på dagar, månader och år för att visa att du säkert kan göra detta om det behövs.

Jag använde också $toDate aggregeringspipeline-operatör för att returnera tidsstämpeldelen av ObjectId.


  1. Ska jag dela Redis-anslutning mellan filer/moduler?

  2. MongoDB Skriv oro:3 måste-känna varningar

  3. MongoDB $exp

  4. Hur använder man tredje parts bibliotek i glasfisk?