sql >> Databasteknik >  >> NoSQL >> MongoDB

5 sätt att få timmen från en dejt i MongoDB

MongoDB tillhandahåller ett bra utbud av aggregeringspipeline-operatörer för att arbeta med datum, inklusive operatörer som extraherar vissa delar av datum, såsom år, månad, dag, timmar, minuter, etc.

Det finns också ett par MongoDB-metoder som gör att du kan iterera genom en markör och använda en JavaScript-funktion. Du kan därför använda JavaScript för att extrahera datumvärden och datumdelar etc från ett fält efter behov.

Den här artikeln presenterar 5 sätt att returnera timdelen från ett Date-objekt i MongoDB.

Exempeldata

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

{ "_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") }

Följande exempel visar olika alternativ för att returnera timdelen från born fältet för dessa dokument.

$hour Operatör

$hour operatören är speciellt utformad för att returnera ett dokument med timdelen av ett givet datum.

Vi kan köra följande kod för att returnera timdelen från born fältet i dokumentet ovan.

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

Resultat:

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

Du kan också ange tidszonen när du använder $hour operatör.

Se MongoDB $hour för mer information och exempel.

$dateToString Operatör

$dateToString operatorn konverterar ett datumobjekt till en sträng enligt ett användarspecificerat format. Användaren kan därför ange att endast timdelen returneras om så krävs.

Det finns formatspecifikationer för varje datumdel. %H formatspecifikationen returnerar timmen.

Exempel:

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

Resultat:

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

Vi kunde ha tillhandahållit fler formatspecifikationer för att inkludera datumdelar i resultatet, men eftersom vi bara är intresserade av att extrahera timmen i den här artikeln använde vi bara en formatspecifikator.

Se MongoDB $dateToString för mer information och exempel.

$dateToParts Operatör

$dateToParts operatören returnerar ett dokument som innehåller de beståndsdelar av ett givet BSON Date-värde som individuella egenskaper. De egenskaper som returneras är year , month , day , hour , minute , second och millisecond .

Vi skulle därför kunna använda $dateToParts i ett pipelinesteg, lägg sedan till ett annat pipelinesteg som extraherar hour del.

Här är vad $dateToParts returnerar för våra tre dokument:

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

Resultat:

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

Detta resultat kan sedan skickas till nästa steg i pipelinen för att extrahera bara hour fältet.

Här är vad som händer om vi lägger till ytterligare en projektion för bara hour fält:

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

Resultat:

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

Poängen här är om du använder $dateToParts i din pipeline har du automatiskt tillgång till timdelen (och alla andra portioner) i nästa steg.

Se MongoDB $dateToParts för mer information och exempel.

forEach() Metod

Du kan använda cursor.forEach() att iterera genom markören med en JavaScript-metod som getHours() eller getUTCHours() för att bara returnera timvärdet.

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

Resultat:

23
4
10

getUTCHours() JavaScript-metoden returnerar ett heltal, mellan 0 och 23, som representerar timmarna i det givna datumet enligt universell tid.

Du kanske också märker att de tidigare alternativen returnerar ett helt dokument som innehåller ett namn/värdepar, medan det här alternativet bara returnerar det faktiska timvärdet och inte hela dokumentet.

map() Metod

cursor.map() Metoden tillämpar en funktion på varje dokument som markören besöker och kombinerar värdena till en array.

Exempel:

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

Resultat:

[ 9, 14, 20 ]

Du kanske har märkt att de resulterande timmarna skiljer sig från de tidigare exemplen. Det beror på att jag i det här exemplet använde getHours() JavaScript-metoden. Denna metod returnerar sitt resultat enligt lokal tid. Jag kunde lika gärna ha använt getUTCHours() .


  1. Kan jag fråga MongoDB ObjectId efter datum?

  2. Hur kör jag Redis på Windows 32 bit?

  3. Filtrera undermatrisen för en matris efter vissa kriterier

  4. hur man skickar en variabel till ett regex