文档菜单
文档首页
/
MongoDB 手册
/ / /

$map(聚合查询)

本页内容

  • 定义
  • 兼容性
  • 语法
  • 示例
  • 向数组每个元素添加
  • 截断每个数组元素
  • 将摄氏温度转换为华氏温度
  • 了解更多
$map

将一个表达式应用到数组中的每个元素上,并返回一个包含应用结果的数组。表达式 用于每个数组元素。

您可以使用 $map 在以下环境中部署

  • MongoDB Atlas:MongoDB 在云中的完全托管服务

$map 表达式有以下语法

{ $map: { input: <expression>, as: <string>, in: <expression> } }
字段
规范
输入

一个解析为数组的 表达式

如果 input 解析为 null 或引用一个缺失的字段,$map 将返回 null

如果 input 解析为一个非数组、非空的值,管道将出现错误。

作为
可选。表示 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 ]
}
]

有关前述示例中使用的表达式的更多信息,请参阅

返回

$ltrim