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.