Wanneer we de dag uit een datum halen, hangt de exacte optie die we gebruiken af van hoe we de dag willen weergeven.
Willen we bijvoorbeeld de dag van de week, de dag van de maand of de dag van het jaar? Of misschien willen we het in ISO 8601-formaat? De retourwaarde zal meestal anders zijn, afhankelijk van welke we kiezen.
Dit artikel onderzoekt die opties en presenteert daarom 8 manieren om het daggedeelte 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 dagdeel van de born
veld van die documenten.
De $dayOfWeek
Operator
Zoals de naam al aangeeft, is de $dayOfWeek
operator retourneert de dag van de week vanaf een datum.
We kunnen de volgende code uitvoeren om de dag van de week te retourneren vanaf de born
veld in bovenstaand document.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Resultaat:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
Het is ook mogelijk om de tijdzone te specificeren bij gebruik van de $dayOfWeek
exploitant.
Zie MongoDB $dayOfWeek
voor meer informatie en voorbeelden.
De $dayOfMonth
Operator
De $dayOfMonth
operator retourneert de dag van de maand vanaf een datum.
Voorbeeld:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Resultaat:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
U kunt ook de tijdzone specificeren bij gebruik van de $dayOfMonth
exploitant.
Zie MongoDB $dayOfMonth
voor meer informatie en voorbeelden.
De $dayOfYear
Operator
Ja, je raadt het al. De $dayOfYear
operator retourneert de dag van het jaar vanaf een datum.
Voorbeeld:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Resultaat:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
De $dayOfYear
operator accepteert ook een tijdzoneparameter.
Zie MongoDB $dayOfYear
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 dagdeel wordt geretourneerd.
Er zijn formaatspecificaties voor elk datumgedeelte en als het gaat om het daggedeelte, hebt u de keuze uit formaatspecificaties die afhangen van of u de dag van de week, de dag van de maand, de dag van het jaar of de dag van de week in ISO 8601-formaat.
Voorbeeld:
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()
Resultaat:
{ "birthDayOfWeek" : "1", "birthDayOfMonth" : "03", "birthDayOfYear" : "003", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "1", "birthDayOfMonth" : "08", "birthDayOfYear" : "342", "birthDayOfWeekISO" : "7" } { "birthDayOfWeek" : "5", "birthDayOfMonth" : "24", "birthDayOfYear" : "268", "birthDayOfWeekISO" : "4" }
We hadden meer formaatspecificaties kunnen geven om andere datumdelen in het resultaat op te nemen, maar aangezien we in dit artikel alleen geïnteresseerd zijn in het extraheren van de dag, hebben we alleen formaatspecificaties gebruikt voor het retourneren van het daggedeelte.
Zie MongoDB $dateToString
voor meer informatie en voorbeelden.
Zie ook MongoDB $dateToString
Formaatspecificaties voor een lijst met formaatspecificaties die u kunt gebruiken met $dateToString
.
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 kunnen daarom $dateToParts
. gebruiken in één pijplijnfase, voeg vervolgens een andere pijplijnfase toe die de day
. extraheert onderdeel indien nodig.
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 de day
. te extraheren veld.
Dit is wat er gebeurt als we nog een projectie toevoegen voor alleen de day
veld:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Resultaat:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
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 optie zijn.
Het is ook vermeldenswaard dat $dateToParts
accepteert 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 om alleen de dagwaarde te retourneren.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Resultaat:
1 0 4
In dit geval gebruiken we de JavaScript getDay()
methode, die een geheel getal tussen 0 en 6 retourneert, dat overeenkomt met de dag van de week voor de opgegeven datum, volgens de lokale tijd.
Een andere optie is om de getUTCDay()
. te gebruiken methode, die universele tijd gebruikt. We gebruiken deze methode in het volgende voorbeeld.
Als alternatief hadden we de JavaScript getDate()
. kunnen gebruiken methode, die een geheel getal retourneert, tussen 1 en 31, dat de dag van de maand voor de opgegeven datum vertegenwoordigt.
Deze optie retourneert ook alleen de werkelijke dagwaarde, en niet het hele document, zoals in de vorige voorbeelden.
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.getUTCDay();
return c;
}
);
Resultaat:
[ 0, 0, 4 ]
Zoals gezegd, de JavaScript getUTCDay()
methode retourneert het resultaat met behulp van universele tijd. In dit geval resulteerde dit in een andere waarde die werd geretourneerd voor het eerste document (we kregen 0
in dit voorbeeld, versus 1
in de vorige).
De $isoDayOfWeek
Operator
Als u de dag van de week in ISO 8601-indeling moet retourneren, kunt u $isoDayOfWeek
gebruiken . 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,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultaat:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
In dit geval krijgen we een heel ander resultaat dan we kregen bij het gebruik van de $dayOfWeek
operator, vanwege de manier waarop ISO 8601 datums berekent.
Hier is een voorbeeld dat dit verschil laat zien:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" },
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultaat:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 } { "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }