$map(聚合查询)
定义
$map
将一个表达式应用到数组中的每个元素上,并返回一个包含应用结果的数组。表达式 用于每个数组元素。
兼容性
您可以使用 $map
在以下环境中部署
MongoDB Atlas:MongoDB 在云中的完全托管服务
MongoDB Enterprise:MongoDB 的基于订阅的自托管版本
MongoDB Community:MongoDB 的开源、免费使用和自托管版本
语法
$map
表达式有以下语法
{ $map: { input: <expression>, as: <string>, in: <expression> } }
字段 | 规范 |
---|---|
输入 | |
作为 | 可选。表示 input 数组中每个单独元素的名字。如果没有指定名字,变量名字默认为 this 。 |
在 | 一个表达式,应用于 input 数组的每个元素。该表达式使用在 as 中指定的变量名字单独引用每个元素。 |
有关表达式的更多信息,请参阅表达式运算符。
示例
向数组的每个元素添加
在 mongosh
中,创建一个名为 grades
的示例集合,包含以下文档
db.grades.insertMany( [ { quizzes: [ 5, 6, 7 ] }, { quizzes: [ ] }, { quizzes: [ 3, 8, 9 ] } ] )
以下聚合操作使用 $map
与 $add
表达式来递增 quizzes
数组中的每个元素 2
。
db.grades.aggregate( [ { $project: { adjustedGrades: { $map: { input: "$quizzes", as: "grade", in: { $add: [ "$$grade", 2 ] } } } } } ] )
此操作返回以下结果
[ { _id: ObjectId("6390b8f7237da390c6869a62"), adjustedGrades: [ 7, 8, 9 ] }, { _id: ObjectId("6390b8f7237da390c6869a63"), adjustedGrades: [] }, { _id: ObjectId("6390b8f7237da390c6869a64"), adjustedGrades: [ 5, 10, 11 ] } ]
截断数组中的每个元素
在 mongosh
中,创建一个名为 deliveries
的样本集合,包含以下文档
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
来 截断
distances
数组中的每个元素的整数。
db.deliveries.aggregate( [ { $project: { city: "$city", integerValues: { $map: { input: "$distances", as: "decimalValue", in: { $trunc: "$$decimalValue" } } } } } ] )
此操作返回以下结果
[ { _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 ] } ]
将摄氏度温度转换为华氏度
在 mongosh
中,创建一个名为 temperatures
的样本集合,包含以下文档
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
。
db.temperatures.aggregate( [ { $addFields: { "tempsF": { $map: { input: "$tempsC", as: "tempInCelsius", in: { $add: [ { $multiply: [ "$$tempInCelsius", 9/5 ] }, 32 ] } } } } } ] )
此操作返回以下结果
[ { _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 ] } ]
了解更多
有关前述示例中使用的表达式的更多信息,请参阅