$isNumber (agregação)
Definição
$isNumber
$isNumber
verifica se aexpressão especificada é resolvida para um dos seguintes BSON types numéricos:$isNumber
Devoluções:true
se a expressão resolver para um número.false
se a expressão resolver para qualquer outro tipo de BSON,null
ou um campo ausente.
$isNumber
tem a seguinte sintaxe de expressão do operador:{ $isNumber: <expression> } O argumento pode ser qualquer expressãoválida.
Dica
Veja também:
$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" : NumberDecimal(26.0) }, { "_id" : 2, "reading" : NumberLong(25.0) }, { "_id" : 3, "reading" : NumberInt(24) }, { "_id" : 4, "reading" : 24.0 }, { "_id" : 5, "reading" : "24" }, { "_id" : 6, "reading" : [ NumberDecimal(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" : NumberDecimal("26.0000000000000"), "isNum " : true, "type" : "decimal" } { "_id" : 2, "reading" : NumberLong(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" : [ NumberDecimal("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
,grades
já contém o valor de ponto numérico. Definapoints
como igual agrades
.Se
false
,grades
contém um valor de letra de string. Use$switch
para 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 }