MongoDB biedt een aantal aggregatiepijplijnoperators voor het werken met datums, inclusief 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. U kunt daarom JavaScript gebruiken om naar wens datumwaarden en datumgedeelten, enz. uit een veld te extraheren.
Dit artikel presenteert 5 manieren om het maandgedeelte 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 retourneren van het maandgedeelte van de born
veld van die documenten.
De $month
Operator
De $month
operator is speciaal ontworpen om een document terug te sturen met het maandgedeelte van een bepaalde datum.
We kunnen de volgende code uitvoeren om de maand terug te geven vanaf de born
veld in bovenstaand document.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Resultaat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
U kunt ook de tijdzone specificeren bij gebruik van de $month
exploitant.
Zie MongoDB $month
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 maandgedeelte wordt geretourneerd.
Er zijn formaatspecificaties voor elk datumgedeelte. De %m
formaatspecificatie retourneert de maand.
Voorbeeld:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Resultaat:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
We hadden meer formaatspecificaties kunnen geven om datumdelen in het resultaat op te nemen, maar aangezien we in dit artikel alleen geïnteresseerd zijn in het extraheren van de maand, 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
.
We zouden daarom $dateToParts
. kunnen gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die de month
. 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 } }
Dit resultaat kan vervolgens worden doorgegeven aan de volgende fase in de pijplijn om alleen de month
. te extraheren veld.
Dit is wat er gebeurt als we nog een projectie toevoegen voor alleen de month
veld:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Resultaat:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
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 wel bij u passen.
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 getMonth()
of getUTCMonth()
om alleen de maandwaarde terug te geven.
db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Resultaat:
0 11 8
Merk op dat de getMonth()
JavaScript-methode retourneert het maandnummer als een geheel getal, tussen 0 en 11.
U zult misschien ook merken dat de vorige opties een heel document retourneren dat een naam/waarde-paar bevat, terwijl deze optie alleen de werkelijke maandwaarde retourneert 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.getMonth();
return c;
}
);
Resultaat:
[ 0, 11, 8 ]
Nogmaals, we krijgen de maanden als gehele getallen tussen 0 en 11.