$addFields (aggregation)
On this page本页内容
Definition定义
$addFields
-
Adds new fields to documents.向文档中添加新字段。$addFields
outputs documents that contain all existing fields from the input documents and newly added fields.$addFields
输出包含输入文档和新添加字段中所有现有字段的文档。The$addFields
stage is equivalent to a$project
stage that explicitly specifies all existing fields in the input documents and adds the new fields.$addFields
阶段相当于$project
阶段,它显式指定输入文档中的所有现有字段并添加新字段。NoteStarting in version 4.2, MongoDB adds a new aggregation pipeline stage从4.2版本开始,MongoDB添加了一个新的聚合管道阶段$set
that is an alias for$addFields
.$set
,它是$addFields
的别名。
Syntax语法
The stage has the following syntax:该阶段具有以下语法:
{ $addFields: { <newField>: <expression>, ... } }
Specify the name of each field to add and set its value to an aggregation expression or an empty object. For more information on expressions, see Expressions.指定要添加的每个字段的名称,并将其值设置为聚合表达式或空对象。有关表达式的详细信息,请参阅表达式。
If the name of the new field is the same as an existing field name (including 如果新字段的名称与现有字段名称(包括_id
), $addFields
overwrites the existing value of that field with the value of the specified expression._id
)相同,$addFields
将用指定表达式的值覆盖该字段的现有值。
Behavior行为
$addFields
appends new fields to existing documents.将新字段附加到现有文档中。You can include one or more您可以在聚合操作中包含一个或多个$addFields
stages in an aggregation operation.$addFields
阶段。$addFields
accepts the embedding of objects where you can set a value to an aggregation expression or to an empty object.接受对象的嵌入,您可以在其中为聚合表达式或空对象设置值。For example, the following nested objects are accepted:例如,接受以下嵌套对象:{$addFields: { a: { b: { } } } }
To add a field or fields to embedded documents (including documents in arrays) use the dot notation.要向嵌入文档(包括数组中的文档)添加一个或多个字段,请使用点表示法。See example.请参见示例。To add an element to an existing array field with要使用$addFields
, use with$concatArrays
. See example.$addFields
将元素添加到现有数组字段中,请与$concatArrays
一起使用。请参见示例。
Examples实例
Using Two $addFields
Stages使用两个$addFields
阶段
$addFields
StagesA collection called 一个名为scores
contains the following documents:scores
的集合包含以下文档:
{
_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
}
The following operation uses two 以下操作使用两个$addFields
stages to include three new fields in the output documents:$addFields
阶段在输出文档中包括三个新字段:
db.scores.aggregate( [
{
$addFields: {
totalHomework: { $sum: "$homework" } ,
totalQuiz: { $sum: "$quiz" }
}
},
{
$addFields: { totalScore:
{ $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )
The operation returns the following documents:该操作返回以下文档:
{
"_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
}
Adding Fields to an Embedded Document向嵌入文档添加字段
Use dot notation to add new fields to embedded documents.使用点表示法将新字段添加到嵌入文档中。
For example, create a collection called 例如,使用以下文档创建一个名为vehicles
with the following documents: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" }
]
)
The following aggregation operation adds a new field 以下聚合操作将一个新字段fuel_type
to the embedded document specs
.fuel_type
添加到嵌入的文档specs
中。
db.vehicles.aggregate( [
{
$addFields: {
"specs.fuel_type": "unleaded"
}
}
] )
The operation returns the following results:该操作返回以下结果:
{ _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" } }
Overwriting an existing field覆盖现有字段
Specifying an existing field name in an 在$addFields
operation causes the original field to be replaced.$addFields
操作中指定现有字段名会导致替换原始字段。
A collection called 一个名为animals
contains the following document:animals
的集合包含以下文档:
{ _id: 1, dogs: 10, cats: 15 }
The following 下面的$addFields
operation specifies the cats
field.$addFields
操作指定cats
字段。
db.animals.aggregate( [
{
$addFields: { "cats": 20 }
}
] )
The operation returns the following document:该操作返回以下文档:
{ _id: 1, dogs: 10, cats: 20 }
It is possible to replace one field with another. 可以用另一个字段替换一个字段。In the following example the 在下面的示例中,item
field substitutes for the _id
field.item
字段替换_id
字段。
A collection called 一个名为fruit
contains the following documents:fruit
的集合包含以下文件:
{ "_id" : 1, "item" : "tangerine", "type" : "citrus" }
{ "_id" : 2, "item" : "lemon", "type" : "citrus" }
{ "_id" : 3, "item" : "grapefruit", "type" : "citrus" }
The following aggregration operation uses 以下聚合操作使用$addFields
to replace the _id
field of each document with the value of the item
field, and replaces the item
field with a static value.$addFields
将每个文档的_id
字段替换为item
字段的值,并将item
字段替换成静态值。
db.fruit.aggregate( [
{
$addFields: {
_id : "$item",
item: "fruit"
}
}
] )
The operation returns the following:该操作返回以下内容:
{ "_id" : "tangerine", "item" : "fruit", "type" : "citrus" }
{ "_id" : "lemon", "item" : "fruit", "type" : "citrus" }
{ "_id" : "grapefruit", "item" : "fruit", "type" : "citrus" }
Add Element to an Array将元素添加到数组
Create a sample 创建一个包含以下内容的样例scores
collection with the following: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 }
])
You can use 您可以将$addFields
with a $concatArrays
expression to add an element to an existing array field. $addFields
与$concatArrays
表达式一起使用,将元素添加到现有的数组字段中。For example, the following operation uses 例如,以下操作使用$addFields
to replace the homework
field with a new array whose elements are the current homework
array concatenated with another array containing a new score [ 7 ]
.$addFields
将homework
字段替换为一个新数组,该数组的元素是与包含新分数[7]
的另一个数组连接的当前homework
数组。
db.scores.aggregate([
{ $match: { _id: 1 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])
The operation returns the following:该操作返回以下内容:
{ "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10, 7 ], "quiz" : [ 10, 8 ], "extraCredit" : 0 }