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 ]
  }
]
相关推荐
倔强的石头_12 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
AI全栈实验室4 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip