MongoDB fournit un certain nombre d'opérateurs de pipeline d'agrégation pour travailler avec des dates. Cela inclut les opérateurs qui extraient certaines parties de dates, telles que l'année, le mois, le jour, etc.
Il existe également quelques méthodes MongoDB qui vous permettent de parcourir un curseur et d'appliquer une fonction JavaScript. Cela vous permet donc d'utiliser JavaScript pour extraire des valeurs de date et des parties de date, etc. d'un champ.
Cet article présente 6 façons de renvoyer la partie année à partir d'une date dans MongoDB.
Exemple de données
Supposons que nous ayons une collection appelée cats
avec les documents suivants :
{ "_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") }
Les exemples suivants illustrent diverses options pour renvoyer la partie année à partir de born
champ de ces documents.
Le $year
Opérateur
Le $year
est le choix le plus évident pour extraire la partie année d'une date. Il est spécifiquement conçu pour renvoyer un document avec la partie année d'une date.
Nous pouvons exécuter le code suivant pour renvoyer l'année à partir du born
champ dans le document ci-dessus.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthYear: { $year: "$born" }
}
}
]
)
Résultat :
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Vous pouvez également spécifier le fuseau horaire lorsque vous utilisez le $year
opérateur.
Voir MongoDB $year
pour plus d'informations et d'exemples.
Le $dateToString
Opérateur
Le $dateToString
L'opérateur convertit un objet date en une chaîne selon un format spécifié par l'utilisateur. L'utilisateur peut donc spécifier que seule la partie année est renvoyée si nécessaire.
Il existe des spécificateurs de format pour chaque partie de date. Le %Y
le spécificateur de format renvoie l'année.
Exemple :
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthYear: { $dateToString: { format: "%Y", date: "$born" } }
}
}
]
)
Résultat :
{ "birthYear" : "2021" } { "birthYear" : "2019" } { "birthYear" : "2020" }
Nous aurions pu fournir plus de spécificateurs de format pour inclure des parties de date dans le résultat, mais comme nous ne souhaitons extraire que l'année dans cet article, nous n'avons utilisé qu'un seul spécificateur de format.
Voir MongoDB $dateToString
pour plus d'informations et d'exemples.
Le $dateToParts
Opérateur
Le $dateToParts
L'opérateur renvoie un document qui contient les parties constitutives d'une valeur de date BSON donnée en tant que propriétés individuelles. Les propriétés renvoyées sont year
, month
, day
, hour
, minute
, second
et millisecond
.
Armés de cette connaissance, nous pouvons utiliser $dateToParts
dans une étape de pipeline, puis ajoutez une autre étape de pipeline qui extrait l'year
partie.
Voici ce que $dateToParts
retours pour nos trois documents :
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Résultat :
{ "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 } }
Ces données peuvent être transmises à l'étape suivante du pipeline pour extraire uniquement l'year
champ.
Voici ce qui se passe si nous ajoutons une autre projection uniquement pour l'year
champ :
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthYear: "$dateParts.year"
}
}
]
)
Résultat :
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Ce n'est évidemment pas aussi concis que d'utiliser les options précédentes. Cependant, selon ce que vous faites dans votre pipeline, cette approche pourrait être une option pratique.
Le $dateToParts
l'opérateur accepte également un iso8601
paramètre, qui modifie le document de sortie pour utiliser les champs de date de semaine ISO.
Voir MongoDB $dateToParts
pour plus d'informations et d'exemples.
Le forEach()
Méthode
Vous pouvez utiliser cursor.forEach()
pour parcourir le curseur, en utilisant une méthode JavaScript telle que getFullYear()
ou getUTCFullYear()
pour renvoyer uniquement la valeur de l'année.
db.cats.find().forEach(
function(c) {
print(
c.born.getFullYear()
);
}
);
Résultat :
2021 2019 2020
Les options précédentes renvoient un document entier contenant une paire nom/valeur. Cette option renvoie uniquement la valeur réelle de l'année, et non l'intégralité du document.
La map()
Méthode
Le cursor.map()
La méthode applique une fonction à chaque document visité par le curseur et combine les valeurs dans un tableau.
Exemple :
db.cats.find().map(
function(c) {
c = c.born.getFullYear();
return c;
}
);
Résultat :
[ 2021, 2019, 2020 ]
Le $isoWeekYear
Opérateur
Si vous devez renvoyer l'année au format ISO 8601, utilisez $isoWeekYear
. L'année ISO 8601 commence par le lundi de la semaine 1 et se termine par le dimanche de la dernière semaine.
Exemple :
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Résultat :
{ "birthIsoWeekYear" : NumberLong(2020) } { "birthIsoWeekYear" : NumberLong(2019) } { "birthIsoWeekYear" : NumberLong(2020) }
Notez que la première année est maintenant 2020 au lieu de 2021 comme dans les exemples précédents. Toutes les années ne seront pas différentes lors de l'utilisation de $isoWeekYear
, car cela dépend de la date en question.