Definição
$isNumber$isNumberverifica se aexpressão especificada é resolvida para um dos seguintes BSON types numéricos:$isNumberDevoluções:truese a expressão resolver para um número.falsese a expressão resolver para qualquer outro tipo de BSON,nullou um campo ausente.
$isNumbertem a seguinte sintaxe de expressão do operador:{ $isNumber: <expression> } O argumento pode ser qualquer expressãoválida.
Dica
$type (Aggregation)- retorna o tipo de BSON do argumento.$type (Query)- filtra campos com base no tipo BSON.
Exemplo
Utilize $isNumber para verificar se um campo é numérico
Execute a seguinte operação na collection examples.sensors para preencher os dados de teste:
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") ]} ])
A aggregation a seguir usa o estágio de aggregation $addFields para adicionar os seguintes campos a cada documento:
isNumber- Indica se o valor dereadingé um número inteiro, decimal, double ou longo.type- Indica o tipo de BSON dereading.
db.sensors.aggregate([{ $addFields : { "isNumber" : { $isNumber : "$reading" }, "hasType" : {$type : "$reading"} } }])
A operação de aggregation retorna os seguintes 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 utilizando $isNumber
A collection grades contém dados sobre as notas dos alunos. O campo grade pode armazenar uma nota de letra de string ou um valor de ponto numérico.
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 } ])
A aggregation a seguir usa o estágio $addFields para adicionar um campo points contendo o valor numérico da nota desse curso. O estágio usa o operador $cond para definir o valor de points com base na saída de $isNumber:
Se
true,gradesjá contém o valor de ponto numérico. Definapointscomo igual agrades.Se
false,gradescontém um valor de letra de string. Use$switchpara converter a nota de letra em seu valor equivalente em pontos e atribua apoints.
Em seguida, o aggregation pipeline usa o estágio $group para agrupar em student_id e calcular o GPA average do aluno.
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" } } } ])
O aggregation pipeline gera um documento por student_id exclusivo com a média de pontos do GPA do aluno:
{ "_id" : 457864153, "GPA" : 3.5 } { "_id" : 978451637, "GPA" : 3 }