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

5 måder at få måneden fra en dato i MongoDB

MongoDB leverer en række aggregerede pipeline-operatører til at arbejde med datoer, herunder operatører, der uddrager bestemte dele af datoer, såsom år, måned, dag 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 månedsdelen fra en dato 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") }

Følgende eksempler viser forskellige muligheder for at returnere månedsdelen fra born felt af disse dokumenter.

$month Operatør

$month operatør er specifikt designet til at returnere et dokument med månedsdelen af ​​en given dato.

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

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

Resultat:

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

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

Se MongoDB $month 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 månedsdelen returneres, hvis det kræves.

Der er formatspecifikationer for hver datodel. %m formatspecifikation returnerer måneden.

Eksempel:

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

Resultat:

{ "birthMonth" : "01" }
{ "birthMonth" : "12" }
{ "birthMonth" : "09" }

Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesserede i at udtrække måneden 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-stadium, og tilføj derefter et andet pipeline-stadium, der uddrager month 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 month felt.

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

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

Resultat:

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

Dette er åbenbart ikke så kortfattet som at bruge de tidligere muligheder. Afhængigt af, hvad du laver i din pipeline, kan denne tilgang dog passe regningen.

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 getMonth() eller getUTCMonth() for kun at returnere månedsværdien.

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

Resultat:

0
11
8

Bemærk, at getMonth() JavaScript-metoden returnerer månedsnummeret som et heltal mellem 0 og 11.

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 månedsvæ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 i en matrix.

Eksempel:

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

Resultat:

[ 0, 11, 8 ] 

Igen får vi månederne som heltal mellem 0 og 11.


  1. python-rq worker lukker automatisk

  2. Hvad er standard session timeout, og hvordan man konfigurerer det, når du bruger Spring Session med Redis som backend

  3. Redis klient

  4. Analyse af langsomme forespørgsler i MongoDB