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 ]
  }
]
相关推荐
晴天のVlog1 分钟前
Fastapi使用MongoDB作为数据库
数据库·python·mongodb·fastapi
Desmend__14 分钟前
正则表达式那些事儿
数据库·mysql·正则表达式
袁庭新31 分钟前
LuaRocks如何安装数据库驱动?
java·数据库·redis·lua·luarocks·袁庭新
Narutolxy42 分钟前
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
数据库
chusheng184043 分钟前
Python 正则表达式进阶用法:分组与引用详解
数据库·python·正则表达式
喵叔哟2 小时前
重构代码之移动字段
java·数据库·重构
念白4432 小时前
智能病历xml提取
数据库·sql·oracle
qingy_20462 小时前
【JavaWeb】JavaWeb入门之XML详解
数据库·oracle
大数据面试宝典2 小时前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
努力的小雨2 小时前
快速上手 KSQL:轻松与数据库交互的利器
数据库·经验分享