MongoDB聚合运算符:$isNumber

$isNumber聚合运算符返回操作数是否是一个数值(Integer、Decimal、Double、Long),返回一个布尔值,如果是数值返回true,否则返回false

语法

{ $isNumber: <expression> }

举例

$isNumber检查字段是否是数值类型

使用下面的脚本创建sensors集合:

db.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" : "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
  }
])

下面的聚合使用$addFields阶段添加points字段,包含了课程的成绩值。该阶段使用$cond运算符根据$isNumber的输出设置points的值:

  • 如果为 true,则成绩已包含数字分值。设定分数等于成绩。
  • 如果为 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 }

相关推荐

  1. MongoDB聚合运算符:$isNumber

    2024-03-25 06:54:01       41 阅读
  2. MongoDB聚合运算符:$add

    2024-03-25 06:54:01       55 阅读
  3. MongoDB聚合运算符:$arrayToObject

    2024-03-25 06:54:01       52 阅读
  4. MongoDB聚合运算符;$dateToParts

    2024-03-25 06:54:01       52 阅读
  5. MongoDB聚合运算符:$dayOfWeek

    2024-03-25 06:54:01       53 阅读
  6. MongoDB聚合运算符:$dayOfMonth

    2024-03-25 06:54:01       51 阅读
  7. MongoDB聚合运算符;$dateToString

    2024-03-25 06:54:01       48 阅读
  8. MongoDB聚合运算符:$dayOfYear

    2024-03-25 06:54:01       48 阅读
  9. MongoDB聚合运算符:$denseRank

    2024-03-25 06:54:01       42 阅读
  10. MongoDB聚合运算符:$dateTrunc

    2024-03-25 06:54:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 06:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 06:54:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 06:54:01       82 阅读
  4. Python语言-面向对象

    2024-03-25 06:54:01       91 阅读

热门阅读

  1. 利用K8S Statefulset搭建Etcd集群 - PVC存储

    2024-03-25 06:54:01       46 阅读
  2. AtCoder - C - Many Replacement (字符串)

    2024-03-25 06:54:01       45 阅读
  3. CloudCompare 二次开发(29)——最小二乘拟合平面

    2024-03-25 06:54:01       46 阅读
  4. 卷积神经网络基础

    2024-03-25 06:54:01       48 阅读
  5. 基于PyTorch深度学习实战入门系列-PyTorch基础全

    2024-03-25 06:54:01       37 阅读
  6. jQuery选择器

    2024-03-25 06:54:01       41 阅读
  7. Android 10.0 mt8788关于摄像头方向旋转功能实现

    2024-03-25 06:54:01       39 阅读
  8. haproxy和keepalived的区别与联系

    2024-03-25 06:54:01       38 阅读