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

8 måder at få dagen fra en date på i MongoDB

Når du trækker dagen ud fra en dato, vil den nøjagtige mulighed, vi bruger, afhænge af, hvordan vi ønsker, at dagen skal repræsenteres.

Vil vi for eksempel have ugedagen, månedsdagen eller årets dag? Eller måske vil vi have det i ISO 8601-format? Returværdien vil normalt være forskellig alt efter hvilken vi vælger.

Denne artikel undersøger disse muligheder og præsenterer derfor 8 måder at returnere dagdelen 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 dagdelen fra born felt af disse dokumenter.

$dayOfWeek Operatør

Som navnet antyder, er $dayOfWeek operatør returnerer ugedagen fra en dato.

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

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

Resultat:

{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

Det er også muligt at angive tidszonen, når du bruger $dayOfWeek operatør.

Se MongoDB $dayOfWeek for mere information og eksempler.

$dayOfMonth Operatør

$dayOfMonth operatør returnerer dagen i måneden fra en dato.

Eksempel:

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

Resultat:

{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

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

Se MongoDB $dayOfMonth for mere information og eksempler.

$dayOfYear Operatør

Ja, du gættede det. $dayOfYear operatør returnerer dagen i året fra en dato.

Eksempel:

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

Resultat:

{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

$dayOfYear operatøren accepterer også en tidszoneparameter.

Se MongoDB $dayOfYear 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 dagsdelen returneres, hvis det kræves.

Der er formatspecifikationer for hver datodel, og når det kommer til dagsdelen, har du et valg af formatspecifikationer, der vil afhænge af, om du vil returnere ugedag, dag i måned, dag i år eller ugedag i ISO 8601-format.

Eksempel:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Resultat:

{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Vi kunne have leveret flere formatspecifikationer for at inkludere andre datodele i resultatet, men da vi kun er interesseret i at udtrække dagen i denne artikel, brugte vi kun formatspecifikationer til at returnere dagdelen.

Se MongoDB $dateToString for mere information og eksempler.

Se også MongoDB $dateToString Formatspecifikationer for en liste over formatspecifikationer, som du kan bruge med $dateToString .

$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 kan derfor bruge $dateToParts i én pipeline-fase, og tilføj derefter en anden pipeline-fase, der uddrager day del om nødvendigt.

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 day felt.

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

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

Resultat:

{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

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 mulighed.

Det er også værd at nævne, at $dateToParts accepterer 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 at bruge en JavaScript-metode til kun at returnere dagsværdien.

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

Resultat:

1
0
4

I dette tilfælde bruger vi JavaScript getDay() metode, som returnerer et helt tal, mellem 0 og 6, svarende til ugedagen for den givne dato, i henhold til lokal tid.

En anden mulighed er at bruge getUTCDay() metode, som bruger universel tid. Vi bruger denne metode i det næste eksempel.

Alternativt kunne vi have brugt JavaScript getDate() metode, som returnerer et helt tal mellem 1 og 31, der repræsenterer dagen i måneden for den givne dato.

Denne mulighed returnerer også kun den faktiske dagsværdi og ikke hele dokumentet, som i de foregående eksempler.

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.getUTCDay();
    return c;
  }
);

Resultat:

[ 0, 0, 4 ]

Som nævnt er JavaScript getUTCDay() metoden returnerer sit resultat ved hjælp af universel tid. I dette tilfælde resulterede det i, at en anden værdi blev returneret for det første dokument (vi fik 0 i dette eksempel versus 1 i den forrige).

$isoDayOfWeek Operatør

Hvis du skal returnere ugedagen i ISO 8601-format, kan du bruge $isoDayOfWeek . 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,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultat:

{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

I dette tilfælde får vi et helt andet resultat, end vi fik ved brug af $dayOfWeek operatør, på grund af den måde, ISO 8601 beregner datoer på.

Her er et eksempel, der viser denne forskel:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultat:

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }

  1. Sådan bruges variabler i MongoDB Map-reducer kortfunktion

  2. Hvordan kan jeg adgangskodebeskytte min /sidekiq-rute (dvs. kræve godkendelse til Sidekiq::Webværktøjet)?

  3. MongoDB $lte Aggregation Pipeline Operator

  4. Slaget om NoSQL-databaserne - Sammenligning af MongoDB og Firebase