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

6 måder at få året fra en dato i MongoDB

MongoDB leverer en hel del aggregeringspipeline-operatører til at arbejde med datoer. Dette inkluderer 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. Dette giver dig derfor mulighed for at bruge JavaScript til at udtrække datoværdier og datodele osv. fra et felt.

Denne artikel præsenterer 6 måder at returnere årsdelen 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 årsdelen fra born felt af disse dokumenter.

$year Operatør

$year operatør er det mest oplagte valg til at udtrække årsdelen fra en dato. Det er specifikt designet til at returnere et dokument med årsdelen af ​​en dato.

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

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

Resultat:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

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

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

Der er formatspecifikationer for hver datodel. %Y formatspecifikation returnerer året.

Eksempel:

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

Resultat:

{ "birthYear" : "2021" }
{ "birthYear" : "2019" }
{ "birthYear" : "2020" }

Vi kunne have leveret flere formatspecifikationer for at inkludere datodele i resultatet, men da vi kun er interesseret i at udtrække årstallet 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 .

Bevæbnet med denne viden kan vi bruge $dateToParts i én pipeline-fase, og tilføj derefter en anden pipeline-fase, der uddrager year 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
	}
}

Disse data kan videregives til næste trin i pipelinen for kun at udtrække year felt.

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

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

Resultat:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

Dette er åbenbart ikke så kortfattet som at bruge de tidligere muligheder. Men afhængigt af hvad du laver i din pipeline, kan denne tilgang være en praktisk mulighed.

$dateToParts operatøren accepterer også en iso8601 parameter, som ændrer outputdokumentet til at bruge ISO-ugedatofelter.

Se MongoDB $dateToParts for mere information og eksempler.

forEach() Metode

Du kan bruge cursor.forEach() at iterere gennem markøren ved hjælp af en JavaScript-metode såsom getFullYear() eller getUTCFullYear() for kun at returnere årsværdien.

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

Resultat:

2021
2019
2020

De foregående muligheder returnerer et helt dokument, der indeholder et navn/værdi-par. Denne mulighed returnerer kun den faktiske årsvæ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.getFullYear();
    return c;
  }
);

Resultat:

[ 2021, 2019, 2020 ]

$isoWeekYear Operatør

Hvis du skal returnere året i ISO 8601-format, skal du bruge $isoWeekYear . ISO 8601-året starter med mandagen i uge 1 og slutter med søndagen i den sidste uge.

Eksempel:

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

Resultat:

{ "birthIsoWeekYear" : NumberLong(2020) }
{ "birthIsoWeekYear" : NumberLong(2019) }
{ "birthIsoWeekYear" : NumberLong(2020) }

Bemærk, at det første år nu er 2020 i stedet for 2021 som i de tidligere eksempler. Ikke alle år vil være forskellige, når du bruger $isoWeekYear , fordi det afhænger af den pågældende dato.


  1. Tager summen af ​​kolonnen i MongoDB

  2. Redis:NOAUTH-godkendelse påkrævet, men der er ingen adgangskodeindstilling

  3. Hvordan spørger du efter er ikke null i Mongo?

  4. Er der MGET-analog til Redis-hash?