$isNumber (聚合)
定义
示例
使用 $isNumber 检查字段是否为数字
对 examples.sensors
集合执行以下操作以填充测试数据
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) ]} ])
以下聚合操作使用 $addFields
聚合阶段向每个文档添加以下字段
isNumber
- 表示reading
的值是整数、小数、双精度浮点数或长整数。type
- 表示reading
的 BSON 类型。
db.sensors.aggregate([{ $addFields : { "isNumber" : { $isNumber : "$reading" }, "hasType" : {$type : "$reading"} } }])
聚合操作返回以下结果
{ "_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" }
使用 $isNumber 条件修改字段
grades
集合包含有关学生成绩的数据。 grade
字段可以存储字母成绩 或 数字点值。
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 } ])
以下聚合使用$addFields
阶段添加一个包含该课程数值等级的points
字段的操作。该阶段使用$cond
运算符根据$isNumber
的输出设置points
的值。
如果
true
,则grades
已包含数值等级。将points
设置为等于grades
。如果
false
,则grades
包含一个字符串字母值。使用$switch
将字母等级转换为等效的数值等级并分配给points
。
聚合管道随后使用$group
阶段按student_id
进行分组并计算学生的平均GPA。
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" } } } ])
聚合管道输出每个唯一的student_id
对应的一个文档,其中包含该学生的GPA等级点平均数。
{ "_id" : 457864153, "GPA" : 3.5 } { "_id" : 978451637, "GPA" : 3 }