使用数学运算MongoDB进行聚合

时间:2018-02-19 02:16:13

标签: database mongodb nosql non-relational-database

下午好,您如何进行以下查询:每项价格(" Precios")的10%折扣。

我正在尝试使用查询:

db.tienda.aggregate( [ 
    { 
        $project: { 
            "Productos.Nombre": 1,
            "Productos.Precio": 1, 
            "Descuento": { 
                $sum: [ 
                    "$Productos.Precio", 
                    { 
                        $multiply: [ 
                            "$Productos.Precio", 
                             -0.10 
                        ]
                    } 
                ] 
            } 
        } 
    }
] )

我的文件结构是:

db.tienda.insert( [
{ 
 "Codigo": 1, "Nombre": "Fabrica comida", 
 "Productos": [ { "Codigo": "C1", "Nombre": "Papitas", "Precio": 1.20 }, { 
 "Codigo": "C2", "Nombre": "Perro caliente", "Precio": 3.10 }, { "Codigo": 
 "C3", "Nombre": "Hamburguesa", "Precio": 4 }, { "Codigo": "C4", "Nombre": 
 "Pizza", "Precio": 2.60 }, { "Codigo": "C5", "Nombre": "Malteada", 
 "Precio": 3 } ] 
},
{ 
 "Codigo": 2, "Nombre": "Tecnologia", 
 "Productos": [ { "Codigo": "T1", "Nombre": "Producto 8", "Precio": 300 }, { 
 "Codigo": "T2", "Nombre": "Smart TV", "Precio": 1200 }, { "Codigo": "T3", 
 "Nombre": "Teatro en casa", "Precio": 250 }, { "Codigo": "T4", "Nombre": 
 "Laptop", "Precio": 560 }, { "Codigo": "T5", "Nombre": "DVD", "Precio": 160 
 } ] 
},
{ 
 "Codigo": 3, "Nombre": "Deportes", 
 "Productos": [ { "Codigo": "D1", "Nombre": "Balon de futbol", "Precio": 20 
 }, { "Codigo": "D2", "Nombre": "Bate de baseball", "Precio": 49.99 }, { 
 "Codigo": "D3", "Nombre": "Canilleras", "Precio": 7.80 }, { "Codigo": "D4", 
 "Nombre": "Equipo de buceo", "Precio": 650 }, { "Codigo": "D5", "Nombre": 
 "Raqueta de tenis", "Precio": 25.50 } ] 
},
{ 
 "Codigo": 4, "Nombre": "Muebles", 
 "Productos": [ { "Codigo": "M1", "Nombre": "Armario", "Precio": 330 }, { 
 "Codigo": "M2", "Nombre": "Mesa de centro", "Precio": 60 }, { "Codigo": 
 "M3", "Nombre": "Comedor", "Precio": 1090 }, { "Codigo": "M4", "Nombre": 
 "Sala-Comedor", "Precio": 860 }, { "Codigo": "M5", "Nombre": "Lampara", 
 "Precio": 40 } ] 
},
{ 
 "Codigo": 5, "Nombre": "Hobbies", 
 "Productos": [ { "Codigo": "H1", "Nombre": "Mesa de hockey", "Precio": 320 
 }, { "Codigo": "H2", "Nombre": "Mesa de ping-pong", "Precio": 610 }, { 
 "Codigo": "H3", "Nombre": "Mesa de billar", "Precio": 2400 }, { "Codigo": 
 "H4", "Nombre": "Consola de videojuegos", "Precio": 220 }, { "Codigo": 
 "H5", "Nombre": "Mesa de poker", "Precio": 1650 } ] 
}
] )

知道执行查询的方式是什么?

提前致谢

2 个答案:

答案 0 :(得分:1)

我相信您应该使用聚合框架的$ unwind运算符(https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/)来规范化Productos数据。

我不确定您想要的首选格式,但这是我提出的查询:

db.tienda.aggregate( [
    { $unwind: "$Productos" },
    { $project: {
        "Productos.Nombre": 1,
        "Productos.Precio": 1,
        "Productos.Descuento": {
            $multiply: [
                "$Productos.Precio",
                1-0.10
                ]
            }
        }
    },
    { $group: { 
        _id: "$_id",
        Productos: { $push: "$Productos" }
        }
    }
])

我添加了$ group运算符,然后将Productos数组重新组合在一起。

请注意,我只是简单地执行操作1-0.10来计算乘数,而不是使用$ sum运算符来计算乘数。

答案 1 :(得分:0)

尝试此聚合来计算所有产品的10%折扣

db.tienda.aggregate([
    {
        $project: {
            "Productos.Nombre": 1,
            "Productos.Precio": 1,
            "Descuento": {$subtract : [{$sum : "$Productos.Precio"},{$multiply : [{$sum : "$Productos.Precio"}, 0.1]}]}
        }
    }
]).pretty()