MongoDB聚合运算符:$map

文章目录

$map聚合运算符将指定的表达式应用于数组元素,对数组每个元素进行计算并返回计算后的数组。

语法

js 复制代码
{ $map: { input: <expression>, as: <string>, in: <expression> } }

参数说明:

  • input:可解析为数组的表达式。
  • as:可选参数,数组元素的变量名,可以在表达式中引用,如果没有指定变量名,缺省用this指代。
  • in:应用于数组元素的表达式,表达式会单独针对数组的每个元素进行计算,可以使用as指定的变量名来指代数组元素。

举例

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

js 复制代码
db.grades.insertMany( [
  { quizzes: [ 5, 6, 7 ] },
  { quizzes: [ ] },
  { quizzes: [ 3, 8, 9 ] }
] )

下面的聚合操作使用$map$add对数组quizzes的每个元素加2:

js 复制代码
db.grades.aggregate( [
   {
      $project: {
         adjustedGrades: {
           $map: {
             input: "$quizzes",
             as: "grade",
             in: { $add: [ "$$grade", 2 ] }
           }
         }
      }
   }
 ] )

操作返回下面的结果:

js 复制代码
[
  {
    _id: ObjectId("6390b8f7237da390c6869a62"),
    adjustedGrades: [ 7, 8, 9 ]
  },
  {
    _id: ObjectId("6390b8f7237da390c6869a63"),
    adjustedGrades: []
  },
  {
    _id: ObjectId("6390b8f7237da390c6869a64"),
    adjustedGrades: [ 5, 10, 11 ]
  }
]

对数组元素取整

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

js 复制代码
db.deliveries.insertMany( [
  {
    "city" : "Bakersfield",
    "distances" : [ 34.57, 81.96, 44.24 ]
  },
  {
    "city" : "Barstow",
    "distances" : [ 73.28, 9.67, 124.36 ]
  },
  {
    "city" : "San Bernadino",
    "distances" : [ 16.04, 3.25, 6.82 ]
  }
] )

下面的聚合操作使用$maptruncate对数组distances的每个元素进行取整:

js 复制代码
db.deliveries.aggregate( [
   {
      $project: {
         city: "$city",
         integerValues: {
            $map: {
               input: "$distances",
               as: "decimalValue",
               in: { $trunc: "$$decimalValue" }
            }
         }
      }
   }
 ] )

操作返回下面的结果:

js 复制代码
[
  {
    _id: ObjectId("6390b9b1237da390c6869a65"),
    city: 'Bakersfield',
    integerValues: [ 34, 81, 44 ]
  },
  {
    _id: ObjectId("6390b9b1237da390c6869a66"),
    city: 'Barstow',
    integerValues: [ 73, 9, 124 ]
  },
  {
    _id: ObjectId("6390b9b1237da390c6869a67"),
    city: 'San Bernadino',
    integerValues: [ 16, 3, 6 ]
  }
]

将摄氏度转为华氏度

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

js 复制代码
db.temperatures.insertMany( [
  {
    "date" : ISODate("2019-06-23"),
    "tempsC" : [ 4, 12, 17 ]
  },
  {
    "date" : ISODate("2019-07-07"),
    "tempsC" : [ 14, 24, 11 ]
  },
  {
    "date" : ISODate("2019-10-30"),
    "tempsC" : [ 18, 6, 8 ]
  }
] )

下面的聚合操作使用$addFields阶段向tempsF文档添加一个新字段,其中包含tempsC数组中元素的华氏度等效值,为了将摄氏温度转换为华氏温度,使用$map$multiply将摄氏度乘以9/5然后使用$add加上32

js 复制代码
 db.temperatures.aggregate( [
   {
      $addFields: {
         "tempsF": {
            $map: {
               input: "$tempsC",
               as: "tempInCelsius",
               in: {
                  $add: [ { $multiply: [ "$$tempInCelsius", 9/5 ] }, 32 ]
               }
            }
          }
      }
    }
] )

操作返回下面的结果:

js 复制代码
[
  {
    _id: ObjectId("6390ba11237da390c6869a68"),
    date: ISODate("2019-06-23T00:00:00.000Z"),
    tempsC: [ 4, 12, 17 ],
    tempsF: [ 39.2, 53.6, 62.6 ]
  },
  {
    _id: ObjectId("6390ba11237da390c6869a69"),
    date: ISODate("2019-07-07T00:00:00.000Z"),
    tempsC: [ 14, 24, 11 ],
    tempsF: [ 57.2, 75.2, 51.8 ]
  },
  {
    _id: ObjectId("6390ba11237da390c6869a6a"),
    date: ISODate("2019-10-30T00:00:00.000Z"),
    tempsC: [ 18, 6, 8 ],
    tempsF: [ 64.4, 42.8, 46.4 ]
  }
]
相关推荐
bin91532 分钟前
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
Miqiuha10 分钟前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐1 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
Java探秘者5 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2301_786964365 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
阿维的博客日记6 小时前
图文并茂解释水平分表,垂直分表,水平分库,垂直分库
数据库·分库分表
wrx繁星点点7 小时前
事务的四大特性(ACID)
java·开发语言·数据库
小小娥子7 小时前
Redis的基础认识与在ubuntu上的安装教程
java·数据库·redis·缓存
DieSnowK7 小时前
[Redis][集群][下]详细讲解
数据库·redis·分布式·缓存·集群·高可用·新手向
-XWB-8 小时前
【MySQL】数据目录迁移
数据库·mysql