sql >> Database >  >> NoSQL >> MongoDB

6 manieren om het jaar te krijgen vanaf een datum in MongoDB

MongoDB biedt nogal wat aggregatiepijplijnoperators voor het werken met datums. Dit omvat operators die bepaalde delen van datums extraheren, zoals het jaar, de maand, de dag, enz.

Er zijn ook een aantal MongoDB-methoden waarmee u door een cursor kunt bladeren en een JavaScript-functie kunt toepassen. Hierdoor kunt u JavaScript gebruiken om datumwaarden en datumdelen, enz. uit een veld te extraheren.

Dit artikel presenteert 6 manieren om het jaargedeelte van een datum in MongoDB te retourneren.

Voorbeeldgegevens

Stel dat we een verzameling hebben met de naam cats met de volgende documenten:

{ "_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 volgende voorbeelden demonstreren verschillende opties voor het teruggeven van het jaardeel van de born veld van die documenten.

De $year Operator

De $year operator is de meest voor de hand liggende keuze om het jaardeel uit een datum te halen. Het is speciaal ontworpen om een ​​document terug te sturen met het jaargedeelte van een datum.

We kunnen de volgende code uitvoeren om het jaar terug te geven van de born veld in bovenstaand document.

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

Resultaat:

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

U kunt ook de tijdzone specificeren bij gebruik van de $year exploitant.

Zie MongoDB $year voor meer informatie en voorbeelden.

De $dateToString Operator

De $dateToString operator converteert een datumobject naar een string volgens een door de gebruiker gespecificeerd formaat. De gebruiker kan daarom specificeren dat indien nodig alleen het jaargedeelte wordt geretourneerd.

Er zijn formaatspecificaties voor elk datumgedeelte. De %Y formaatspecificatie geeft het jaar terug.

Voorbeeld:

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

Resultaat:

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

We hadden meer formaatspecificaties kunnen geven om datumgedeelten in het resultaat op te nemen, maar aangezien we in dit artikel alleen geïnteresseerd zijn in het extraheren van het jaar, hebben we slechts één formaatspecificatie gebruikt.

Zie MongoDB $dateToString voor meer informatie en voorbeelden.

De $dateToParts Operator

De $dateToParts operator retourneert een document dat de samenstellende delen van een bepaalde BSON-datumwaarde als individuele eigenschappen bevat. De geretourneerde eigenschappen zijn year , month , day , hour , minute , second en millisecond .

Gewapend met deze kennis kunnen we $dateToParts . gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die het year . extraheert onderdeel.

Dit is wat $dateToParts retouren voor onze drie documenten:

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

Resultaat:

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

Deze gegevens kunnen worden doorgegeven aan de volgende fase in de pijplijn om alleen het year te extraheren veld.

Dit is wat er gebeurt als we nog een projectie toevoegen voor alleen het year veld:

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

Resultaat:

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

Dit is natuurlijk niet zo beknopt als het gebruik van de vorige opties. Afhankelijk van wat u in uw pijplijn doet, kan deze aanpak echter een handige optie zijn.

De $dateToParts operator accepteert ook een iso8601 parameter, die het uitvoerdocument wijzigt om ISO-weekdatumvelden te gebruiken.

Zie MongoDB $dateToParts voor meer informatie en voorbeelden.

De forEach() Methode

U kunt cursor.forEach() . gebruiken om door de cursor te lopen, met behulp van een JavaScript-methode zoals getFullYear() of getUTCFullYear() om alleen de jaarwaarde terug te geven.

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

Resultaat:

2021
2019
2020

De vorige opties retourneren een heel document dat een naam/waarde-paar bevat. Deze optie retourneert alleen de werkelijke jaarwaarde en niet het hele document.

De map() Methode

De cursor.map() methode past een functie toe op elk document dat door de cursor wordt bezocht en combineert de waarden in een array.

Voorbeeld:

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

Resultaat:

[ 2021, 2019, 2020 ]

Het $isoWeekYear Operator

Als u het jaar moet retourneren in ISO 8601-indeling, gebruikt u $isoWeekYear . Het ISO 8601-jaar begint met de maandag van week 1 en eindigt met de zondag van de laatste week.

Voorbeeld:

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

Resultaat:

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

Merk op dat het eerste jaar nu 2020 is in plaats van 2021 zoals in de vorige voorbeelden. Niet alle jaren zullen anders zijn bij het gebruik van $isoWeekYear , omdat het afhangt van de datum in kwestie.


  1. Hoe in redis zoeken naar hash-sleutels?

  2. Probleem bij het retourneren van gegevens die zijn opgehaald uit DB-query's die in de lus worden aangeroepen

  3. Redis Publiceren/abonneren

  4. Dubbele records verwijderen met MapReduc