sql >> Databasteknik >  >> NoSQL >> MongoDB

6 sätt att få året från en dejt i MongoDB

MongoDB tillhandahåller en hel del aggregeringspipeline-operatörer för att arbeta med datum. Detta inkluderar operatörer som extraherar vissa delar av datum, såsom år, månad, dag, 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. Detta gör att du därför kan använda JavaScript för att extrahera datumvärden och datumdelar etc från ett fält.

Den här artikeln presenterar 6 sätt att returnera årsdelen från ett datum 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 årsdelen från born fältet för dessa dokument.

$year Operatör

$year operatör är det mest uppenbara valet för att extrahera årsdelen från ett datum. Den är speciellt utformad för att returnera ett dokument med årsdelen av ett datum.

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

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

Resultat:

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

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

Se MongoDB $year 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 årsdelen returneras om så krävs.

Det finns formatspecifikationer för varje datumdel. %Y formatspecifikatorn returnerar året.

Exempel:

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

Resultat:

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

Vi kunde ha tillhandahållit fler formatspecifikationer för att inkludera datumdelar i resultatet, men eftersom vi bara är intresserade av att extrahera årtalet 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 .

Med denna kunskap kan vi använda $dateToParts i ett pipelinesteg, lägg sedan till ett annat pipelinesteg som extraherar year 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
	}
}

Dessa data kan skickas till nästa steg i pipelinen för att bara extrahera year fältet.

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

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

Resultat:

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

Detta är uppenbarligen inte lika kortfattat som att använda de tidigare alternativen. Men beroende på vad du gör i din pipeline kan detta tillvägagångssätt vara ett praktiskt alternativ.

$dateToParts operatören accepterar också en iso8601 parameter, som ändrar utdatadokumentet för att använda ISO-veckodatumfält.

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 getFullYear() eller getUTCFullYear() för att bara returnera årsvärdet.

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

Resultat:

2021
2019
2020

De föregående alternativen returnerar ett helt dokument som innehåller ett namn/värdepar. Det här alternativet returnerar bara det faktiska årsvä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.getFullYear();
    return c;
  }
);

Resultat:

[ 2021, 2019, 2020 ]

$isoWeekYear Operatör

Om du behöver returnera årtalet i ISO 8601-format, använd $isoWeekYear . ISO 8601-året börjar med måndagen i vecka 1 och slutar med söndagen i sista veckan.

Exempel:

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

Resultat:

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

Lägg märke till att det första året nu är 2020 istället för 2021 som i de tidigare exemplen. Alla år kommer inte att vara olika när du använder $isoWeekYear , eftersom det beror på datumet i fråga.


  1. Mongodb-fråga baserad på objekt vid specifik position i arrayen

  2. Redis Pub Sub-kanalminne

  3. Aggregation med uppdatering i mongoDB

  4. Hur kapslar man en lista i en struktur i Redis för att minska toppnivån?