数组中的MongoDb $ addFields $在数组中乘以两个值

时间:2017-05-13 10:20:18

标签: mongodb aggregation-framework

MongoDb版本3.4.4

如何汇总新密钥' total',其价值是' course'的产品。和'数量'对于数组快照中的每个对象。

示例文档:

{
    cur: "EUR",
    snapshot: [
        {
            id: "24352345",
            course: 58.12,
            quantity: 13
        },    
        {
            id: "34552345",
            course: 18.12,
            quantity: 63
        }
    ]
}

期望的结果:

{
    cur: "EUR",
    snapshot: [
        {
            id: "24352345",
            course: 58.12,
            quantity: 13,
            total: 755.56
        },    
        {
            id: "34552345",
            course: 18.12,
            quantity: 63,
            total: 1141.56
        }
    ]
}

第一次尝试:

db.mycoll.aggregate([{
    $addFields: {
        "snapshot.total": {
            $multiply:["$snapshot.quantity", "$snapshot.course"]
        }
    }
}])

" ERRMSG" :" $ multiply仅支持数字类型,而不支持数组"

第二次尝试:

db.mycoll.aggregate( [ 
    { "$addFields": { 
        "snapshot.total": {
            "$map": { 
                "input": "$snapshot", 
                "as": "row", 
                "in": { "$multiply": [ 
                    { "$ifNull": [ "$$row.quantity", 0 ] }, 
                    { "$ifNull": [ "$$row.course", 0 ] } 
                ]} 
            }
        } 
    }} 
])

'总计'的不受欢迎的价值是一个包含所有对象总数的数组:

{
    cur: "EUR",
    snapshot: [
        {
            id: "24352345",
            course: 58.12,
            quantity: 13,
            total: [
                755.56,
                1141.56
            ]
        },    
        {
            id: "34552345",
            course: 18.12,
            quantity: 63,
            total: [
                755.56,
                1141.56
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:3)

修改第二次尝试,将整个快照嵌入文档的字段映射为

db.mycoll.aggregate([
    {
        "$addFields": {
            "snapshot": {
                "$map": {
                    "input": "$snapshot",
                    "as": "row",
                    "in": {
                        "id": "$$row.id",
                        "course": "$$row.course",
                        "quantity": "$$row.quantity",
                        "total": { "$multiply": [ 
                            { "$ifNull": [ "$$row.quantity", 0 ] }, 
                            { "$ifNull": [ "$$row.course", 0 ] } 
                        ]} 
                    }
                }
            }
        }
    }
])