Depuis MongoDB 4.4, vous pouvez utiliser le $isNumber
opérateur de pipeline d'agrégation pour vérifier si une valeur est un nombre ou non.
Il accepte toute expression valide et renvoie true
si l'expression est un nombre, false
si ce n'est pas le cas.
Plus précisément, $isNumber
vérifie si l'expression correspond à l'un des types BSON suivants :
Integer
Decimal
Double
Long
Il renvoie true
si c'est le cas.
Il renvoie false
si l'expression se résout en un autre type BSON, null
, ou un champ manquant.
Exemple
Supposons que nous ayons une collection appelée dogs
avec le document suivant :
{ "_id" : 1, "name" : "Fetch", "weight" : 30 }
Nous pouvons utiliser le code suivant pour voir quels champs sont numériques :
db.dogs.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
name: { $isNumber: "$name" },
weight: { $isNumber: "$weight" }
}
}
]
)
Résultat :
{ "_id" : true, "name" : false, "weight" : true }
Nous pouvons voir que le _id
et weight
les champs sont numériques, mais le name
champ n'est pas (c'est une chaîne).
Exemple 2
Voici un autre exemple qui contient divers champs de différents types de BSON.
Supposons que nous ayons une collection appelée types
avec le document suivant :
{ "_id" : ObjectId("601738d7c8eb4369cf6ad9de"), "double" : 123.75, "string" : "123", "boolean" : true, "date" : ISODate("2020-12-31T23:30:15.123Z"), "integer" : 123, "long" : NumberLong(123), "decimal" : NumberDecimal("123.75"), "object" : { "a" : 1 }, "array" : [ 1, 2, 3 ] }
Pour les besoins de cet article, j'ai nommé chaque champ pour refléter son type BSON.
Nous pouvons maintenant utiliser le code suivant pour renvoyer soit true
ou false
pour chaque champ, selon que le champ est un nombre ou non :
db.types.aggregate(
[
{
$project:
{
_id: { $isNumber: "$_id" },
double: { $isNumber: "$double" },
string: { $isNumber: "$string" },
boolean: { $isNumber: "$boolean" },
date: { $isNumber: "$date" },
integer: { $isNumber: "$integer" },
long: { $isNumber: "$long" },
decimal: { $isNumber: "$decimal" },
object: { $isNumber: "$object" },
array: { $isNumber: "$array" }
}
}
]
).pretty()
Résultat :
{ "_id" : false, "double" : true, "string" : false, "boolean" : false, "date" : false, "integer" : true, "long" : true, "decimal" : true, "object" : false, "array" : false }