Mongodb Aggregation $addFields

$addFieldsaggregate的管道操作符,主要功能为添加新的字段,从版本4.2版以后,也可以用$set替换$addFields
基础语法:{ $addFields: { : , ... } }

一、与$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]
}

你可能感兴趣的:(Mongodb Aggregation $addFields)