Docs 菜单

Docs 主页开发应用程序MongoDB Manual

$addFields(聚合)

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 举例
$addFields

版本 3.4 中的新增功能

为文档添加新字段。$addFields 输出文档包含输入文档中的所有现有字段和新添加的字段。

$addFields阶段相当于$project阶段,后者显式指定输入文档中的所有现有字段并添加新字段。

注意

从版本4开始。 2 ,MongoDB 添加了一个新的聚合管道阶段$set ,它是$addFields的别名。

可以使用 $addFields 查找托管在以下环境中的部署:

  • MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务

$addFields 采用以下形式:

{ $addFields: { <newField>: <expression>, ... } }

指定要添加的每个字段的名称,并将其值设置为聚合表达式。 有关表达式的更多信息,请参阅表达式。

重要

如果新字段名称与现有字段名称(包括 _id)相同,$addFields 将用指定表达式的值覆盖该字段的现有值。

$addFields 将新字段附加到现有文档。可以在聚合操作中包含一个或多个 $addFields 阶段。

要将一个或多个字段添加到嵌入式文档(包括数组中的文档),请使用点表示法。请参阅示例。

要使用$addFields向现有数组字段添加元素,请与$concatArrays一起使用。请参阅示例。

名为 scores 的集合包含以下文档:

db.scores.insertMany( [
{
_id: 1,
student: "Maya",
homework: [ 10, 5, 10 ],
quiz: [ 10, 8 ],
extraCredit: 0
},
{
_id: 2,
student: "Ryan",
homework: [ 5, 6, 5 ],
quiz: [ 8, 8 ],
extraCredit: 8
}
] )

以下操作使用两个$addFields阶段在输出文档中包含三个新字段:

db.scores.aggregate( [
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
},
{
$addFields: { totalScore:
{ $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )

该操作将返回以下文档:

[
{
_id: 1,
student: "Maya",
homework: [ 10, 5, 10 ],
quiz: [ 10, 8 ],
extraCredit: 0,
totalHomework: 25,
totalQuiz: 18,
totalScore: 43
},
{
_id: 2,
student: "Ryan",
homework: [ 5, 6, 5 ],
quiz: [ 8, 8 ],
extraCredit: 8,
totalHomework: 16,
totalQuiz: 16,
totalScore: 40
}
]

使用点符号为嵌入式文档添加新字段。

例如,创建一个包含以下文档的名为 vehicles 的集合:

db.vehicles.insertMany( [
{ _id: 1, type: "car", specs: { doors: 4, wheels: 4 } },
{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } },
{ _id: 3, type: "jet ski" }
] )

以下聚合操作将新字段 fuel_type 添加到嵌入式文档 specs

db.vehicles.aggregate( [
{ $addFields: { "specs.fuel_type": "unleaded" } }
] )

操作返回以下结果:

[
{ _id: 1, type: "car",
specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } },
{ _id: 2, type: "motorcycle",
specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } },
{ _id: 3, type: "jet ski",
specs: { fuel_type: "unleaded" } }
]

$addFields 操作中指定现有字段名称会导致原始字段被替换。

名为 animals 的集合包含以下文档:

db.animals.insertOne(
{ _id: 1, dogs: 10, cats: 15 }
)

以下 $addFields 操作指定 cats 字段。

db.animals.aggregate( [
{
$addFields: { cats: 20 }
}
] )

该操作将返回以下文档:

[ { _id: 1, dogs: 10, cats: 20 } ]

可以用一个字段替换另一个字段。在以下示例中,item 字段替换了 _id 字段。

名为 fruit 的集合包含以下文档:

db.fruit.insertMany( [
{ _id: 1, item: "tangerine", type: "citrus" },
{ _id: 2, item: "lemon", type: "citrus" },
{ _id: 3, item: "grapefruit", type: "citrus" }
] )

以下聚合操作使用 $addFields 将每个文档的 _id 字段替换为 item 字段的值,并将 item 字段替换为静态值。

db.fruit.aggregate( [
{
$addFields: {
_id : "$item",
item: "fruit"
}
}
] )

该操作返回以下内容:

[
{ _id: "tangerine", item: "fruit", type: "citrus" },
{ _id: "lemon", item: "fruit", type: "citrus" },
{ _id: "grapefruit", item: "fruit", type: "citrus" }
]

创建一个包含以下内容的示例 scores 集合:

db.scores.insertMany( [
{ _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },
{ _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
] )

您可以使用$addFields$concatArrays表达式向现有数组字段添加元素。例如,以下操作使用$addFieldshomework字段替换为一个新数组,该数组的元素是当前homework数组与另一个包含新分数[ 7 ]的数组的合并。

db.scores.aggregate( [
{ $match: { _id: 1 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
] )

该操作返回以下内容:

[ { _id: 1, student: "Maya", homework: [ 10, 5, 10, 7 ], quiz: [ 10, 8 ], extraCredit: 0 } ]
← 聚合管道阶段