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 ]
  }
] )

下面的聚合操作使用$map和truncate对数组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 ]
  }
]
相关推荐
IT古董2 小时前
《FDE前沿部署工程师实战教程》33 - Enterprise AI Observability:从Agent Trace到全链路智能运维
数据库·人工智能
for_ever_love__2 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
Nturmoils6 小时前
GROUP BY 先别想当然,查汇总前把规则跑清楚
数据库
最笨的羊羊6 小时前
Oceanbase数据库系列之:向量数据库核心知识
数据库·oceanbase
fish_xk7 小时前
mysql中的表的约束
数据库·mysql
谢亮_vipxieliang7 小时前
Go Channel 高级模式——从底层原理到扇出扇入实战
java·数据库·golang
ggaofeng8 小时前
自己编写邮件服务器和客户端
数据库
java1234_小锋8 小时前
【技术专题】Mysql8 数据库 - Mysql8 添加,更新,删除数据
数据库·mysql
PaperData8 小时前
2015-2024年各省绿色贸易数据
数据库
小羊没烦恼!8 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#