sql >> Database >  >> NoSQL >> MongoDB

MongoDB $dateToString

In MongoDB is de $dateToString aggregatiepijplijnoperator converteert een bepaald datumobject naar een tekenreeks.

De $dateToString operator accepteert een datum, een tijdstempel of een object-ID.

U kunt een indeling opgeven die voor het resultaat moet worden gebruikt door een indelingsspecificatie op te geven. De formaatspecificatie kan elke letterlijke tekenreeks zijn, die 0 of meer formaatspecificaties bevat.

De formaatspecificatie is optioneel vanaf MongoDB versie 4.0, wanneer featureCompatibilityVersion is ingesteld op 4.0 of hoger. Eerdere versies vereisen de formaatspecificatie.

U kunt optioneel de timezone . gebruiken parameter om de te gebruiken tijdzone op te geven.

U kunt ook de onNull . gebruiken parameter om op te geven wat moet worden geretourneerd als de datum null is of ontbreekt.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets met het volgende document:

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

We kunnen de volgende code uitvoeren om een ​​datumreeks te retourneren van de born veld in dat document.

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

Resultaat:

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

Dit voorbeeld gebruikt %Y-%m-%dT%H:%M:%S.%LZ als de formaatspecificatie. Dit is toevallig de standaard formaatspecificatie, maar in dit geval hebben we dit expliciet gespecificeerd. We kunnen zien dat de datumreeks wordt geretourneerd met het opgegeven formaat.

Hier gebruikte ik dateString als de veldnaam die moet worden geretourneerd, maar dit kan van alles zijn (zoals formattedDate , theDate enzovoort).

De _id veld wordt standaard geretourneerd bij het gebruik van projecties in MongoDB, maar in dit voorbeeld heb ik de _id expliciet verborgen veld met _id: 0 .

Zie MongoDB $dateToString Formaatspecificaties voor een lijst met beschikbare formaatspecificaties.

Standaard uitvoer

Zoals vermeld, is de formaatspecificatie in het vorige voorbeeld de standaard formaatspecificatie.

Als u MongoDB versie 4.0 of hoger gebruikt, met featureCompatibilityVersion ingesteld op 4.0 of hoger (zie hoe u uw huidige featureCompatibilityVersion kunt bekijken) en hoe u deze instelt), kunt u de formaatspecificatie weglaten als u wilt dat de datum wordt opgemaakt met het bovenstaande formaat.

Daarom zouden we het vorige kunnen herschrijven. voorbeeld hiervan:

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

Resultaat:

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

Geef een tijdzone op

U kunt een tijdzone specificeren die moet worden gebruikt voor de uitvoer van de $dateToString telefoniste.

De tijdzone kan worden opgegeven met behulp van de Olson-tijdzone-ID (bijv. "Europe/London" , "GMT" ) of de UTC-offset (bijv. "+02:30" , "-1030" ).

Olson tijdzone-ID

Hier is een voorbeeld dat de datumreeks in drie verschillende tijdzones uitvoert, elk met de Olson-tijdzone-ID's:

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

Resultaat:

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

UTC-offset

Hier is een voorbeeld dat de UTC-offset gebruikt.

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

Resultaat:

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

ISO-weekdatumnotatie

Er zijn een paar formaatspecificaties waarmee u de datumreeks kunt uitvoeren met behulp van de ISO 8601-indeling.

U kunt in het bijzonder gebruik maken van:

Formaatspecificatie Uitvoer
%G Jaar in ISO 8601-formaat
%u Dag van de week in ISO 8601-formaat (1-maandag, 7-zondag)
%V Week van het jaar in ISO 8601-formaat

Stel dat we een verzameling hebben met de naam cats met het volgende document:

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

We kunnen de volgende code uitvoeren om de ISO-datumvelden te extraheren uit de born veld in dat document.

Hier is een voorbeeld om te demonstreren:

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

Resultaat:

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

Daarentegen is hieronder hetzelfde voorbeeld, maar met gebruik van de niet-ISO weekdatumdelen.

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

Resultaat:

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

We zien dat het resultaat heel anders is.

De onNull Parameter

De onNull parameter kan worden gebruikt om aan te geven wat moet worden geretourneerd als de datum null is of niet bestaat.

De waarde die is opgegeven voor de onNull parameter kan elke geldige uitdrukking zijn.

Hier is een voorbeeld:

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

Resultaat:

{ "dateString" : "No date supplied" }

In dit geval was de datum null en dus bevat het uitvoerdocument de tekenreeks die ik heb opgegeven voor de onNull parameter.

Retourneer de datumdelen van een ObjectId

U kunt $dateToString . gebruiken om een ​​datumreeks van een ObjectId te retourneren.

ObjectId-waarden zijn hexadecimale waarden van 12 bytes die bestaan ​​uit:

  • Een tijdstempelwaarde van 4 byte, die de creatie van de ObjectId vertegenwoordigt, gemeten in seconden sinds het Unix-tijdperk.
  • Een 5 byte is een willekeurige waarde
  • Een oplopende teller van 3 bytes, geïnitialiseerd op een willekeurige waarde.

Samenvattend ziet ons eerste document er als volgt uit:

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

Dit document bevat een ObjectId. We kunnen daarom $dateToString . gebruiken om een ​​datumreeks te retourneren, gebaseerd op de datum waarop ons document is gemaakt (of meer specifiek, wanneer de _id de ObjectId-waarde van het veld is gemaakt).

Voorbeeld:

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

Resultaat:

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

In dit geval heb ik besloten om alleen het datumgedeelte terug te geven (niet het tijdgedeelte). Ik heb ook de volgorde van de dagen, maanden en jaar veranderd om aan te tonen dat je dit zeker kunt doen als dat nodig is.

Ik gebruikte ook de $toDate aggregatiepijplijnoperator om het tijdstempelgedeelte van de ObjectId te retourneren.


  1. Mongoose voegt meerdere objecten toe aan array indien niet gebaseerd op bestaan

  2. MongoDB $sum en $avg van subdocumenten

  3. Sessie opslaan en ophalen uit Redis

  4. Vertraagde uitvoering / planning met Redis?