On this page本页内容
$isNumber
New in version 4.4.在版本4.4中新增。
$isNumber checks if the specified expression resolves to one of the following numeric BSON types:检查指定的表达式是否解析为以下数字BSON类型之一:
$isNumber returns:返回:
true if the expression resolves to a number.true。false if the expression resolves to any other BSON type, null, or a missing field.null或缺少字段,则返回false。$isNumber has the following operator expression syntax:具有以下运算符表达式语法:
{ $isNumber: <expression> }
The argument can be any valid expression.参数可以是任何有效的表达式。
$type (Aggregation) - $type (Query) - $isNumber to Check If A Field Is Numeric$isNumber检查字段是否为数字Issue the following operation against the 针对examples.sensors collection to populate test data: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) ]} ])
The following aggregation uses the 以下聚合使用$addFields aggregation stage to add the following fields to each document:$addFields聚合阶段将以下字段添加到每个文档中:
isNumber - reading is an integer, decimal, double, or long.reading的值是整数、十进制、双精度还是长型。type - reading.reading的BSON类型。db.sensors.aggregate([{
$addFields : {
"isNumber" : { $isNumber : "$reading" },
"hasType" : {$type : "$reading"}
}
}])
The aggregation operation returns the following results:聚合操作返回以下结果:
{ "_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$isNumber有条件地修改字段The grades collection contains data on student grades. grades集合包含有关学生成绩的数据。The grade field may either store a string letter grade or a numeric point value.grade字段可以存储字符串字母等级或数字点值。
db.getSiblingDB("examples").grades.insertMany([ { "student_id" : 457864153, "class_id" : "M044", "class_desc" : "Introduction to MongoDB 4.4", "grade" : "A" }, { "student_id" : 457864153, "class_id" : "M103", "class_desc" : "Basic Cluster Administration", "grade" : 3.0 }, { "student_id" : 978451637, "class_id" : "M320", "class_desc" : "MongoDB Data Modeling", "grade" : "C" }, { "student_id" : 978451637, "class_id" : "M001", "class_desc" : "MongoDB Basics", "grade" : 4.0 } ])
The following aggregation uses the 以下聚合使用$addFields stage to add a points field containing the numeric grade value for that course. $addFields阶段添加一个包含该课程数字成绩值的分数字段。The stage uses the 阶段使用$cond operator to set the value of points based on the output of $isNumber:$cond运算符根据$isNumber的输出设置points的值:
true, grades already contains the numeric point value. true,则grades已包含数值点值。points equal to grades.points等于grades。false, grades contains a string letter value. false,则grades包含字符串字母值。$switch to convert the letter grade to its equivalent point value and assign to points.$switch将字母成绩转换为其等效点值并指定给points。The aggregation pipeline then uses the 然后,聚合管道使用$group stage to group on the student_id and calculate the student's average GPA.$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" } } } ])
The aggregation pipeline outputs one document per unique 聚合管道为每个唯一的student_id with that student's GPA grade point average:student_id输出一个文档,其中包含该学生的平均GPA成绩:
{ "_id" : 457864153, "GPA" : 3.5 }
{ "_id" : 978451637, "GPA" : 3 }