聚合$set
阶段可以为文档添加新的字段。$set
输出的文档包含输入文档中的所有现有字段和新添加的字段。$set
是$addFields
的别名,从MongoDB4.2开始支持。$set
和$addFields
等价于$project
阶段,这两个阶段都等同于 $project 阶段,后者明确指定输入文档中的所有现有字段并添加新字段。
语法
{
$set: {
<newField>: <expression>, ... } }
指定要添加的每个字段的名称,并将其值设置为聚合表达式或空对象。
如果新字段的名称与现有字段的名称(包括 _id)相同,$set
将用指定表达式的值覆盖该字段的现有值。
使用
- 将新字段追加到现有文档中。可以在聚合操作中包含一个或多个
$set
阶段。 - 接受对象嵌入,您可以将值设置为聚合表达式或空对象。例如,可接受嵌套对象:
{$set:{ a:{ b: { }}}}
- 要在嵌入文档(包括数组中的文档)中添加一个或多个字段,可以使用点符号。
例子
使用两个$set
阶段
创建一个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 }
])
以下操作使用了两个$set
阶段,在输出文档中加入三个新字段:
db.scores.aggregate( [
{
$set: {
totalHomework: {
$sum: "$homework" },
totalQuiz: {
$sum: "$quiz" }
}
},
{
$set: {
totalScore: {
$add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
}
] )
操作返回下面的文档:
{
"_id" : 1,
"student" : "Maya",
"homework" : [ 10, 5, 10 ],
"quiz" : [ 10, 8 ]