sql >> Database >  >> NoSQL >> MongoDB

5 manieren om het uur van een date te krijgen in MongoDB

MongoDB biedt een goede reeks aggregatiepijplijnoperators voor het werken met datums, inclusief operators die bepaalde delen van datums extraheren, zoals het jaar, de maand, de dag, de uren, de minuten, enz.

Er zijn ook een aantal MongoDB-methoden waarmee u door een cursor kunt bladeren en een JavaScript-functie kunt toepassen. U kunt daarom JavaScript gebruiken om naar wens datumwaarden en datumgedeelten, enz. uit een veld te extraheren.

Dit artikel presenteert 5 manieren om het uurgedeelte van een Date-object in MongoDB te retourneren.

Voorbeeldgegevens

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

{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }

De volgende voorbeelden demonstreren verschillende opties voor het teruggeven van het uurgedeelte van de born veld van die documenten.

De $hour Operator

De $hour operator is speciaal ontworpen om een ​​document terug te sturen met het uurgedeelte van een bepaalde datum.

We kunnen de volgende code uitvoeren om het uurgedeelte terug te geven van de born veld in bovenstaand document.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthHour: { $hour: "$born" }
        }
    }
  ]
)

Resultaat:

{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

U kunt ook de tijdzone specificeren bij gebruik van de $hour exploitant.

Zie MongoDB $hour voor meer informatie en voorbeelden.

De $dateToString Operator

De $dateToString operator converteert een datumobject naar een string volgens een door de gebruiker gespecificeerd formaat. De gebruiker kan daarom specificeren dat alleen het uurgedeelte wordt geretourneerd indien nodig.

Er zijn formaatspecificaties voor elk datumgedeelte. De %H formaatspecificatie retourneert het uur.

Voorbeeld:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthHour: { $dateToString: { format: "%H", date: "$born" } }
       }
     }
   ]
)

Resultaat:

{ "birthHour" : "23" }
{ "birthHour" : "04" }
{ "birthHour" : "10" }

We hadden meer formaatspecificaties kunnen geven om datumdelen in het resultaat op te nemen, maar aangezien we in dit artikel alleen geïnteresseerd zijn in het extraheren van het uur, hebben we slechts één formaatspecificatie gebruikt.

Zie MongoDB $dateToString voor meer informatie en voorbeelden.

De $dateToParts Operator

De $dateToParts operator retourneert een document dat de samenstellende delen van een bepaalde BSON-datumwaarde als individuele eigenschappen bevat. De geretourneerde eigenschappen zijn year , month , day , hour , minute , second en millisecond .

We zouden daarom $dateToParts . kunnen gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die het hour extraheert onderdeel.

Dit is wat $dateToParts retouren voor onze drie documenten:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Resultaat:

{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 12,
		"millisecond" : 0
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 30,
		"second" : 0,
		"millisecond" : 0
	}
}

Dit resultaat kan vervolgens worden doorgegeven aan de volgende fase in de pijplijn om alleen het hour te extraheren veld.

Dit is wat er gebeurt als we nog een projectie toevoegen voor slechts het hour veld:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthHour: "$dateParts.hour"
        }
    }
  ]
)

Resultaat:

{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

Het punt hier is, als je $dateToParts . gebruikt in je pijplijn zit, heb je automatisch toegang tot het uurgedeelte (en alle andere gedeelten) in de volgende fase.

Zie MongoDB $dateToParts voor meer informatie en voorbeelden.

De forEach() Methode

U kunt cursor.forEach() . gebruiken om door de cursor te gaan, met behulp van een JavaScript-methode zoals getHours() of getUTCHours() om alleen de uurwaarde terug te geven.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getUTCHours()
      );
  }
);

Resultaat:

23
4
10

De getUTCHours() De JavaScript-methode retourneert een geheel getal tussen 0 en 23, dat de uren op de opgegeven datum vertegenwoordigt volgens de universele tijd.

U zult misschien ook merken dat de vorige opties een heel document retourneren dat een naam/waarde-paar bevat, terwijl deze optie alleen de werkelijke uurwaarde retourneert en niet het hele document.

De map() Methode

De cursor.map() methode past een functie toe op elk document dat door de cursor wordt bezocht en combineert de waarden in een array.

Voorbeeld:

db.cats.find().map(
  function(c) {
    c = c.born.getHours();
    return c;
  }
);

Resultaat:

[ 9, 14, 20 ]

Het is je misschien opgevallen dat de resulterende uren verschillen van de vorige voorbeelden. Dat komt omdat ik in dit voorbeeld de getHours() . heb gebruikt JavaScript-methode. Deze methode retourneert het resultaat volgens de lokale tijd. Ik had net zo goed getUTCHours() . kunnen gebruiken .


  1. Het gebruik van sed op xargs-variabele werkt niet binnen shell-expansie

  2. Rescue:Verbinding geweigerd - Kan geen verbinding maken met Redis op localhost:6379

  3. MongoDB index intersectie

  4. ruby redis client scan vs sleutels