$isNumber (aggregation)

On this page本页内容

Definition定义

$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.如果表达式解析为任何其他BSON类型null或缺少字段,则为false

$isNumber has the following operator expression syntax:具有以下运算符表达式语法

{ $isNumber: <expression> }

The argument can be any valid expression.参数可以是任何有效的表达式

See also参阅

  • $type (Aggregation) - returns the BSON type of the argument.返回参数的BSON类型。
  • $type (Query) - filters fields based on BSON type.根据BSON类型筛选字段。

Example示例

Use $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 - Indicates whether the value of reading is an integer, decimal, double, or long.指示读取的值是整数、十进制、双精度还是长型。
  • type - Indicates the BSON type of 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" }

Conditionally Modify Fields using $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.grades字段可以存储字符串字母等级或数字点值。

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阶段添加一个包含该课程数值等级值的points字段。The stage uses the $cond operator to set the value of points based on the output of $isNumber:该阶段使用$cond运算符根据$isNumber的输出设置points的值:

  • If true, grades already contains the numeric point value. 如果为true,则grades已包含该数值。Set points equal to grades.设定points等于grades
  • If false, grades contains a string letter value. 如果为false,则grades包含一个字符串字母值。Use $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 }