$addFields
aggregate的管道操作符,主要功能为添加新的字段,从版本4.2版以后,也可以用$set
替换$addFields
基础语法:{ $addFields: { <newField>: <expression>, ... } }
一、与$project
的异同
1.$project
与$addFields
都可以向文档中添加指定字段,如果新增字段与现有字段重名,将用新字段覆盖旧有。
2.$addFields
只能新增字段,或利用字段值覆盖的方式修改旧有字段,无法对旧有字段进行筛选屏蔽
$project
可指定显示某些字段,可以指定屏蔽某些字段(这两种方法不能同时使用),可以屏蔽_id,可以添加或重置现有字段值。
二、示例
1.向文档中添加字段
db.getCollection("test").aggregate({
$addFields: {
new1: 1, //添加新字段并赋值:数值型
new2: "1",//添加新字段并赋值:字符型
new3: {$add: ["$totalHomework", "$totalQuiz"]},//添加新字段并赋值:计算公式(求和)
new4:"$totalQuiz",//添加新字段并赋值:已有字段的值
new5:"$quiz.1",//添加新字段并赋值:内嵌文档的值
student:"test",//覆盖原有字段的值
}
})
2.向内嵌文档中添加字段
db.getCollection("test").aggregate({
$addFields: {
"quiz.new1": 1, //添加新字段并赋值:数值型
"quiz.new2": "1",//添加新字段并赋值:字符型
"quiz.new3": {$add: ["$totalHomework", "$totalQuiz"]},//添加新字段并赋值:计算公式(求和)
"quiz.new4":"$totalQuiz",//添加新字段并赋值:已有字段的值
"quiz.new5":"$quiz.1",//添加新字段并赋值:内嵌文档的值
"quiz.2":"test",//覆盖原有字段的值
}
})
3.向数组中添加字段
db.getCollection("test").aggregate([{
$match: {_id: 4}
}, {
$addFields: {
"newArray1": [1, "abc", ["123"], "$quiz", {$add: ["$totalHomework", "$totalQuiz"]}],
//添加数组字段,为数组中添加:数值、字符串、数组、现有字段值,公式
"newArray2": {
$concatArrays: [
//$concatArrays 用于融合数组
"$homework",
[1, "abc", ["123"], "$quiz", {$add: ["$totalHomework", "$totalQuiz"]}]
]
}, //添加新字段newArray2并赋值,融合homework的数组以及newArray1的数组值
}
}])
运行结果
{
"_id":4,
"student":"Ryan",
"homework":[5,6,5],
"quiz":{"1":0,"2":6},
"extraCredit":8,"totalHomework":16,
"totalQuiz":16,"totalScore":40,
"newArray1":[1,"abc",["123"],{"1":0,"2":6},32],
"newArray2":[5,6,5,1,"abc",["123"],{"1":0,"2":6},32]
}