Definición
$isNumber$isNumberverifica si el especificado expresión se resuelve en uno de los siguientes BSON types:$isNumberDevuelve:truesi la expresión se resuelve a un número.falsesi la expresión se resuelve a cualquier otro tipo BSON,null, o a un campo faltante.
$isNumbertiene la siguiente sintaxis de expresión de operador:{ $isNumber: <expression> } El argumento puede ser cualquier expresiónválida.
Tip
$type (Aggregation)- devuelve el tipo BSON del argumento.$type (Query)- filtra campos según el tipo BSON.
Ejemplo
Usar $isNumber para comprobar si un campo es numérico
Emita la siguiente operación contra la colección examples.sensors para completar los datos de prueba:
db.getSiblingDB("examples").sensors.insertMany([ { "_id" : 1, "reading" : Decimal128("26.0") }, { "_id" : 2, "reading" : Long(25) }, { "_id" : 3, "reading" : Int32(24) }, { "_id" : 4, "reading" : 24.0 }, { "_id" : 5, "reading" : "24" }, { "_id" : 6, "reading" : [ Decimal128("26") ]} ])
La siguiente agregación utiliza la etapa de agregación $addFields para agregar los siguientes campos a cada documento:
isNumber- Indica si el valor dereadinges un número entero, decimal, double o largo.type- Indica el tipo BSON dereading.
db.sensors.aggregate([{ $addFields : { "isNumber" : { $isNumber : "$reading" }, "hasType" : {$type : "$reading"} } }])
La operación de agregación devuelve los siguientes resultados:
{ "_id" : 1, "reading" : Decimal128("26.0000000000000"), "isNum " : true, "type" : "decimal" } { "_id" : 2, "reading" : Long(25), "isNum " : true, "type" : "long" } { "_id" : 3, "reading" : 24, "isNum " : true, "type" : "int" } { "_id" : 4, "reading" : 24, "isNum " : true, "type" : "double" } { "_id" : 5, "reading" : "24", "isNum " : false, "type" : "string" } { "_id" : 6, "reading" : [ Decimal128("26.0000000000000") ], "isNum " : false, "type" : "array" }
Modificar campos condicionalmente usando $isNumber
La colección grades contiene datos sobre las calificaciones de los estudiantes. El campo grade puede almacenar un string o un valor numérico en puntos.
db.getSiblingDB("examples").grades.insertMany([ { "student_id" : 457864153, "class_id" : "01", "class_desc" : "Algebra", "grade" : "A" }, { "student_id" : 457864153, "class_id" : "02", "class_desc" : "Chemistry", "grade" : 3.0 }, { "student_id" : 978451637, "class_id" : "03", "class_desc" : "Physics", "grade" : "C" }, { "student_id" : 978451637, "class_id" : "04", "class_desc" : "English", "grade" : 4.0 } ])
La siguiente agregación utiliza la etapa $addFields para añadir un campo points que contiene el valor numérico de la calificación para ese curso. El escenario utiliza el operador $cond para configurar el valor de points según el resultado de $isNumber:
Si
true,gradesya contiene el valor numérico de puntos. Establezcapointsigual agrades.Si
false,gradescontiene un valor de letra de string. Utiliza$switchpara convertir la calificación literal a su valor de punto equivalente y asignarlo apoints.
Luego, la secuencia de agregación utiliza la $group etapa para student_id agrupar en y calcular el average GPA del estudiante.
db.getSiblingDB("examples").grades.aggregate([ { $addFields: { "points" : { $cond : { if : { $isNumber : "$grade" }, then: "$grade" , else: { $switch : { branches: [ { case: {$eq : ["$grade" , "A"]}, then : 4.0 }, { case: {$eq : ["$grade" , "B"]}, then : 3.0 }, { case: {$eq : ["$grade" , "C"]}, then : 2.0 }, { case: {$eq : ["$grade" , "D"]}, then : 1.0 }, { case: {$eq : ["$grade" , "F"]}, then : 0.0 } ] } } } } } }, { $group : { _id : "$student_id", GPA : { $avg : "$points" } } } ])
La canalización de agregación genera un documento por cada student_id único con el promedio de calificaciones GPA de ese estudiante:
{ "_id" : 457864153, "GPA" : 3.5 } { "_id" : 978451637, "GPA" : 3 }