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

5 måder at få timen fra en date på i MongoDB

MongoDB tilbyder et godt udvalg af aggregerede pipeline-operatører til at arbejde med datoer, herunder operatører, der uddrager bestemte dele af datoer, såsom år, måned, dag, timer, minutter osv.

Der er også et par MongoDB-metoder, der giver dig mulighed for at iterere gennem en markør og anvende en JavaScript-funktion. Du kan derfor bruge JavaScript til at udtrække datoværdier og datodele osv. fra et felt efter behov.

Denne artikel præsenterer 5 måder at returnere timedelen fra et Date-objekt i MongoDB.

Eksempel på data

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

{ "_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 følgende eksempler viser forskellige muligheder for at returnere timedelen fra born felt af disse dokumenter.

$hour Operatør

$hour operatør er specifikt designet til at returnere et dokument med timedelen af ​​en given dato.

Vi kan køre følgende kode for at returnere timedelen fra born felt i ovenstående dokument.

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

Resultat:

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

Du kan også angive tidszonen, når du bruger $hour operatør.

Se MongoDB $hour for mere information og eksempler.

$dateToString Operatør

$dateToString operator konverterer et datoobjekt til en streng i henhold til et brugerspecificeret format. Brugeren kan derfor angive, at kun timeportionen returneres, hvis det kræves.

Der er formatspecifikationer for hver datodel. %H formatspecifikationen returnerer timen.

Eksempel:

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

Resultat:

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

Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesserede i at udtrække timen i denne artikel, brugte vi kun én formatspecifikation.

Se MongoDB $dateToString for mere information og eksempler.

$dateToParts Operatør

$dateToParts operatør returnerer et dokument, der indeholder de bestanddele af en given BSON Date-værdi som individuelle egenskaber. De returnerede egenskaber er year , month , day , hour , minute , second og millisecond .

Vi kunne derfor bruge $dateToParts i et pipeline-trin, tilføj derefter et andet pipeline-trin, der uddrager hour del.

Her er hvad $dateToParts returnerer for vores tre dokumenter:

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

Dette resultat kan derefter overføres til næste trin i pipelinen for kun at udtrække hour felt.

Her er, hvad der sker, hvis vi tilføjer endnu en projektion for kun hour felt:

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

Resultat:

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

Pointen her er, hvis du bruger $dateToParts i din pipeline har du automatisk adgang til timedelen (og alle andre portioner) i næste fase.

Se MongoDB $dateToParts for mere information og eksempler.

forEach() Metode

Du kan bruge cursor.forEach() at iterere gennem markøren ved at bruge en JavaScript-metode såsom getHours() eller getUTCHours() for kun at returnere timeværdien.

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

Resultat:

23
4
10

getUTCHours() JavaScript-metoden returnerer et heltal mellem 0 og 23, der repræsenterer timerne på den givne dato i henhold til universel tid.

Du kan også bemærke, at de tidligere muligheder returnerer et helt dokument, der indeholder et navn/værdi-par, hvorimod denne mulighed kun returnerer den faktiske timeværdi og ikke hele dokumentet.

map() Metode

cursor.map() metoden anvender en funktion på hvert dokument, der besøges af markøren og kombinerer værdierne til en matrix.

Eksempel:

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

Resultat:

[ 9, 14, 20 ]

Du har måske bemærket, at de resulterende timer er anderledes end de foregående eksempler. Det er fordi jeg i dette eksempel brugte getHours() JavaScript metode. Denne metode returnerer sit resultat i henhold til lokal tid. Jeg kunne lige så nemt have brugt getUTCHours() .


  1. render_template med flere variabler

  2. Mongo:tæl antallet af ordforekomster i et sæt dokumenter

  3. MongoDB:Hvad er forbindelsespooling og timeout?

  4. Definering af et Mongoose-skema på farten fra en JSON-formateret 'beskrivelse'