Blog de clase Tecnologías para el desarrollo de aplicaciones web

Blog de clase

View on GitHub

Taller MongoDB

Parte 1

Diseñar e implementar una base de datos no relacional en MongoDB con base en el siguiente enunciado:

Se requiere la creación de una tienda virtual de productos varios donde se tenga la capacidad de almacenar para cada producto características tales como el nombre, la descripción del producto, la fecha de creación, el precio y la cantidad en inventario, adicionalmente por cada producto se requiere poder consultar la información del vendedor como el nombre, información de contacto (teléfono o teléfonos, dirección,ciudad de residencia, etc) y calificación por ventas. Poblar la base de datos con varios productos y vendedores haciendo uso de las funciones de creación insertOne o insertMany. A partir de la base de datos implementada realizar las siguientes consultas:

● Consultar todos los productos de la tienda.
● Consultar un producto específico de la tienda por nombre.
● Consultar todos los productos que tengan existencias de la tienda.
● Consultar a todos los vendedores.
● Consultar la información de un vendedor por nombre.
● Consultar todos los vendedores cuya ciudad de residencia sea Medellín.
● Consultar el vendedor con mejor calificación.
● El producto más caro de la tienda. Puede agregar campos y más complejidad a los documentos si lo cree conveniente.

Desarrollo

use tiendaVirtual
db.inventario.insertOne( {"nombre producto":"Crema dental","Descripción del producto":"descripcion", "Fecha de creacion":240421 ,"Precio": 12000 ,"Cantidad de inventario": 10, "vendedor":{"nombre":"Pepito","teléfonos":123, "dirección":"calle123", "ciudad de residencia":"Medellin" ,"calificación por ventas": 10}})
db.inventario.insertOne( {"nombre producto":"Cepillo dental","Descripción del producto":"descripcion", "Fecha de creacion":240421 ,"Precio":5000 ,"Cantidad de inventario": 140, "vendedor":{"nombre":"Panchito","teléfonos":1234, "dirección":"calle1243", "ciudad de residencia":"Bogota" ,"calificación por ventas":8}})
db.inventario.insertOne( {"nombre producto":"jabon","Descripción del producto":"descripcion", "Fecha de creacion":240421 ,"Precio":1000 ,"Cantidad de inventario": 0, "vendedor":{"nombre":"Pepa","teléfonos":1234, "dirección":"calle1243", "ciudad de residencia":"Bogota" ,"calificación por ventas":2}})
db.inventario.insertOne( {"nombre producto":"caja de cervezas","Descripción del producto":"debida", "Fecha de creacion":311221 ,"Precio":60000 ,"Cantidad de inventario": 4, "vendedor":{"nombre":"Juanito","teléfonos":4567, "dirección":"calle1243", "ciudad de residencia":"Bucaramanga" ,"calificación por ventas":8}})
* Consultar a todos los vendedores.
```js
db.inventario.find({},{"vendedor.nombre":1}).pretty()
{
        "_id" : ObjectId("61157778eef8a0052b1da4ce"),
        "vendedor" : {
                "nombre" : "Pepito"
        }
}
{
        "_id" : ObjectId("61157790eef8a0052b1da4cf"),
        "vendedor" : {
                "nombre" : "Panchito"
        }
}
{
        "_id" : ObjectId("611579c4eef8a0052b1da4d0"),
        "vendedor" : {
                "nombre" : "Pepa"
        }
}
 > db.inventario.find({"vendedor.ciudad de residencia":"Medellin"}).pretty()
{
        "_id" : ObjectId("6080e608152dc02b1fc55290"),
        "nombre producto" : "Crema dental",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 12000,
        "Cantidad de inventario" : 10,
        "vendedor" : {
                "nombre" : "Pepito",
                "teléfonos" : 123,
                "dirección" : "calle123",
                "ciudad de residencia" : "Medellin",
                "calificación por ventas" : 10
        }
}

Parte 2

Con base en la base de datos implementada en el punto anterior realizar las siguientes consultas:

● Consultar los productos de la tienda cuyo precio sea mayor a 50 mil pesos

db.inventario.find({"Precio":{$gt:50000}}).pretty()
{
        "_id" : ObjectId("61157fbeeef8a0052b1da4d1"),
        "nombre producto" : "caja de cervezas",
        "Descripción del producto" : "debida",
        "Fecha de creacion" : 311221,
        "Precio" : 60000,
        "Cantidad de inventario" : 4,
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }
}

● Consultar los productos que tengan menos de 50 existencias en inventario

db.inventario.find({"Cantidad de inventario":{$lt:50}}).pretty()
{
        "_id" : ObjectId("61157778eef8a0052b1da4ce"),
        "nombre producto" : "Crema dental",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 12000,
        "Cantidad de inventario" : 10,
        "vendedor" : {
                "nombre" : "Pepito",
                "teléfonos" : 123,
                "dirección" : "calle123",
                "ciudad de residencia" : "Medellin",
                "calificación por ventas" : 10
        }
}
{
        "_id" : ObjectId("611579c4eef8a0052b1da4d0"),
        "nombre producto" : "Jabon",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 1000,
        "Cantidad de inventario" : 0,
        "vendedor" : {
                "nombre" : "Pepa",
                "teléfonos" : 1234,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bogota",
                "calificación por ventas" : 2
        }
}
{
        "_id" : ObjectId("61157fbeeef8a0052b1da4d1"),
        "nombre producto" : "caja de cervezas",
        "Descripción del producto" : "debida",
        "Fecha de creacion" : 311221,
        "Precio" : 60000,
        "Cantidad de inventario" : 4,
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }
}

● Consultar los productos que fueron creados entre el 1 de enero de y el 31 de diciembre de 2020

db.inventario.insertMany( [{"nombre producto":"Papel higienico","Descripción del producto":"aseo", "Fecha de creacion":311220 ,"Precio":12000 ,"Cantidad de inventario": 90, "vendedor":{"nombre":"Juanito","teléfonos":4567, "dirección":"calle1243", "ciudad de residencia":"Bucaramanga" ,"calificación por ventas":8}},{"nombre producto":"cereales","Descripción del producto":"granos", "Fecha de creacion":050120 ,"Precio":15000 ,"Cantidad de inventario": 89, "vendedor":{"nombre":"Pepa","teléfonos":4567, "dirección":"calle1243", "ciudad de residencia":"Barranquilla" ,"calificación por ventas":1}}])

Muestra el número de productos con fechas entre ese rango

 db.inventario.find({$and:[{"Fecha de creacion":{$gte:010120}}, {"Fecha de creacion": {$lte: 311220}}]}).pretty().count()
5

● Consultar todos los productos que contengan la palabra “aseo” en el nombre o en la descripción

db.inventario.find({"Descripción del producto":/aseo/}).pretty()
{
        "_id" : ObjectId("6115830eeef8a0052b1da4d2"),
        "nombre producto" : "Papel higienico",
        "Descripción del producto" : "aseo",
        "Fecha de creacion" : 311220,
        "Precio" : 12000,
        "Cantidad de inventario" : 90,
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }

● Consultar todos los productos cuyo nombre inicie por la letra “C”

db.inventario.find({"nombre producto":/[C]/}).pretty().count()

● Consultar el nombre y la descripción de los productos de un vendedor

 db.inventario.find({"vendedor.nombre":"Pepa"},{"nombre producto": 1}).pretty().count()

● Consultar 10 productos ordenados por nombre alfabeticamente

db.inventario.find({"nombre producto":/[A-Z]/}).sort({"nombre producto":-1}).pretty()
{
        "_id" : ObjectId("6115830eeef8a0052b1da4d2"),
        "nombre producto" : "Papel higienico",
        "Descripción del producto" : "aseo",
        "Fecha de creacion" : 311220,
        "Precio" : 12000,
        "Cantidad de inventario" : 90,
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }
}
{
        "_id" : ObjectId("611579c4eef8a0052b1da4d0"),
        "nombre producto" : "Jabon",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 1000,
        "Cantidad de inventario" : 0,
        "vendedor" : {
                "nombre" : "Pepa",
                "teléfonos" : 1234,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bogota",
                "calificación por ventas" : 2
        }
}
{
        "_id" : ObjectId("61157778eef8a0052b1da4ce"),
        "nombre producto" : "Crema dental",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 12000,
        "Cantidad de inventario" : 10,
        "vendedor" : {
                "nombre" : "Pepito",
                "teléfonos" : 123,
                "dirección" : "calle123",
                "ciudad de residencia" : "Medellin",
                "calificación por ventas" : 10
        }
}
{
        "_id" : ObjectId("61157790eef8a0052b1da4cf"),
        "nombre producto" : "Cepillo dental",
        "Descripción del producto" : "descripcion",
        "Fecha de creacion" : 240421,
        "Precio" : 5000,
        "Cantidad de inventario" : 140,
        "vendedor" : {
                "nombre" : "Panchito",
                "teléfonos" : 1234,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bogota",
                "calificación por ventas" : 8
        }
}

● Consultar los 5 vendedores con mejor reputación de la tienda

db.inventario.aggregate([{$group:{ _id:{nombre:"$vendedor.nombre"}, "calificación por ventas":{$first:"$vendedor.calificación por ventas"} } }, {$limit:5},{$sort:{"calificación por ventas":-1}} ]).pretty()
{ "_id" : { "nombre" : "Pepito" }, "calificación por ventas" : 10 }
{ "_id" : { "nombre" : "Juanito" }, "calificación por ventas" : 8 }
{ "_id" : { "nombre" : "Panchito" }, "calificación por ventas" : 8 }
{ "_id" : { "nombre" : "Pepa" }, "calificación por ventas" : 2 }

● Consultar los productos con toda la información del vendedor

db.inventario.find(null,{"vendedor":1,"_id":0,"nombre producto":1}).pretty()
{
        "nombre producto" : "Crema dental",
        "vendedor" : {
                "nombre" : "Pepito",
                "teléfonos" : 123,
                "dirección" : "calle123",
                "ciudad de residencia" : "Medellin",
                "calificación por ventas" : 10
        }
}
{
        "nombre producto" : "Cepillo dental",
        "vendedor" : {
                "nombre" : "Panchito",
                "teléfonos" : 1234,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bogota",
                "calificación por ventas" : 8
        }
}
{
        "nombre producto" : "Jabon",
        "vendedor" : {
                "nombre" : "Pepa",
                "teléfonos" : 1234,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bogota",
                "calificación por ventas" : 2
        }
}
{
        "nombre producto" : "caja de cervezas",
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }
}
{
        "nombre producto" : "Papel higienico",
        "vendedor" : {
                "nombre" : "Juanito",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Bucaramanga",
                "calificación por ventas" : 8
        }
}
{
        "nombre producto" : "cereales",
        "vendedor" : {
                "nombre" : "Pepa",
                "teléfonos" : 4567,
                "dirección" : "calle1243",
                "ciudad de residencia" : "Barranquilla",
                "calificación por ventas" : 1
        }
}

● Consultar el valor del producto más caro que venda cada vendedor

db.inventario.aggregate([ { $group:{ _id:{Vendedor:"$vendedor.nombre"}, Precio:{$max:"$Precio"} } }, { $sort:{Precio:-1} } ])
{ "_id" : { "Vendedor" : "Juanito" }, "Precio" : 60000 }
{ "_id" : { "Vendedor" : "Pepa" }, "Precio" : 15000 }
{ "_id" : { "Vendedor" : "Pepito" }, "Precio" : 12000 }
{ "_id" : { "Vendedor" : "Panchito" }, "Precio" : 5000 }

● Para todos los vendedores consultar el nombre, el nombre y la cantidad de susproductos y el total de productos en inventario

db.inventario.aggregate([ { $group:{ _id:{Vendedor:"$vendedor.nombre"}, Productos:{$push:"$nombre producto"},"Total Productos Inventario":{$sum:"$Cantidad de inventario"} } },{$addFields:{"Cantidad Productos":{$size:"$Productos"}}} ])
{ "_id" : { "Vendedor" : "Pepa" }, "Productos" : [ "jabon", "cereales" ], "Total Productos Inventario" : 89, "Cantidad Productos" : 2 }
{ "_id" : { "Vendedor" : "Juanito" }, "Productos" : [ "caja de cervezas", "Papel higienico" ], "Total Productos Inventario" : 94, "Cantidad Productos" : 2 }
{ "_id" : { "Vendedor" : "Panchito" }, "Productos" : [ "Cepillo dental" ], "Total Productos Inventario" : 140, "Cantidad Productos" : 1 }
{ "_id" : { "Vendedor" : "Pepito" }, "Productos" : [ "Crema dental" ], "Total Productos Inventario" : 10, "Cantidad Productos" : 1 }

● Consultar el valor total de las ventas de la tienda en un año especifico, primero poblamos la base de datos con las ventas

db.ventas.insertMany([{Fecha:new Date("2018-12-20T16:00:00Z"),Productos:[{nombre:"Crema dental",cantidad:2,precio:12000}],Total:24000},{Fecha:new Date("2019-01-05T21:58:00Z"),Productos:[{nombre:"Crema dental",cantidad:1,precio:12000},{nombre:"cereales",cantidad:2,precio:15000}],Total:42000},{Fecha:new Date("2018-12-15T01:34:00Z"),Productos:[{nombre:"Papel higienico",cantidad:3,precio:12000},{nombre:"Crema dental",cantidad:1,precio:12000}],Total:48000},{Fecha:new Date("2018-12-01T05:45:00Z"),Productos:[{nombre:"Crema dental",cantidad:1,precio:12000},{nombre:"caja de cervezas",cantidad:1,precio:60000},{nombre:"jabon",cantidad:5,precio:1000}],Total:77000},{Fecha:new Date("2018-10-31T18:35:00Z"),Productos:[{nombre:"Cepillo dental",cantidad:2,precio:5000},{nombre:"Crema dental",cantidad:2,precio:12000}],Total:34000},{Fecha:new Date("2018-11-20T10:14:00Z"),Productos:[{nombre:"Crema dental",cantidad:2,precio:12000}],Total:24000},{Fecha:new Date("2018-12-23T14:57:00Z"),Productos:[{nombre:"Crema dental",cantidad:2,precio:12000}],Total:24000}])

Ahora se muestra el valor para el año 2019.

db.ventas.aggregate([{ $match:{$expr:{$eq:[{$year:"$Fecha"},2019]}}},{$group:{_id:null,"Total vendido 2019":{$sum:"$Total"}}},{$project:{_id:0}}])
{ "Total vendido 2019" : 42000 }

● Consultar todos los productos vendidos por un vendedor específico, el valor total por factura y la fecha de venta

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $lookup:
        {
            from:"inventario",
            let:{producto:"$Productos.nombre"},
            pipeline:[
                {
                    $match:
                    {
                        $expr:
                        {
                            $eq:["$$producto","$nombre producto"]
                        }
                    }
                },
                {
                    $project:{nombre:"$vendedor.nombre",_id:0}
                }
            ],
            as:"Vendedor"
        }
    },
    {
        $match:
        {
            "Vendedor.nombre":"Pepa"
        }
    },
    {
        $unwind:"$Vendedor"
    },
    {
        $group:
        {
            _id:{"Fecha venta":"$Fecha"},
            Vendedor:{$first:"$Vendedor.nombre"},
            Productos:{$push:"$Productos.nombre"},
            "Total Fectura":{
                $sum:{
                    $multiply:["$Productos.cantidad","$Productos.precio"]
                }
            }
        }
    }
]).pretty()
{
        "_id" : {
                "Fecha venta" : ISODate("2018-12-01T05:45:00Z")
        },
        "Vendedor" : "Pepa",
        "Productos" : [
                "jabon"
        ],
        "Total Fectura" : 5000
}
{
        "_id" : {
                "Fecha venta" : ISODate("2019-01-05T21:58:00Z")
        },
        "Vendedor" : "Pepa",
        "Productos" : [
                "cereales"
        ],
        "Total Fectura" : 30000
}

● Consultar la información de los 5 productos más vendidos de la tienda y el valor total vendido

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $group:{
            _id: {"Producto":"$Productos.nombre"},
            "Cantidad vendida":{$sum:"$Productos.cantidad"},
            "Total Vendido":{
                $sum:{
                    $multiply:["$Productos.cantidad","$Productos.precio"]
                }
            }
        }
    },
    {
        $sort:{"Cantidad vendida":-1}
    },
    {
        $limit:5
    }
]).pretty()
{
        "_id" : {
                "Producto" : "Crema dental"
        },
        "Cantidad vendida" : 11,
        "Total Vendido" : 132000
}
{
        "_id" : {
                "Producto" : "jabon"
        },
        "Cantidad vendida" : 5,
        "Total Vendido" : 5000
}
{
        "_id" : {
                "Producto" : "Papel higienico"
        },
        "Cantidad vendida" : 3,
        "Total Vendido" : 36000
}
{
        "_id" : {
                "Producto" : "Cepillo dental"
        },
        "Cantidad vendida" : 2,
        "Total Vendido" : 10000
}
{
        "_id" : {
                "Producto" : "cereales"
        },
        "Cantidad vendida" : 2,
        "Total Vendido" : 30000
}

● Consultar el total vendido de cada producto de los vendedores de la tienda, mostrar el nombre del vendedor y la lista de productos con nombre y valor total vendido.

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $lookup:
        {
            from:"inventario",
            let:{producto:"$Productos.nombre"},
            pipeline:[
                {
                    $match:
                    {
                        $expr:
                        {
                            $eq:["$$producto","$nombre producto"]
                        }
                    }
                },
                {
                    $project:{nombre:"$vendedor.nombre",_id:0}
                }
            ],
            as:"Vendedor"
        }
    },
    {
        $unwind:"$Vendedor"
    },
    {
        $group:{
            _id: {"Producto":"$Productos.nombre"},
            Vendedor:{$first:"$Vendedor.nombre"},
            "Cantidad vendida":{$sum:"$Productos.cantidad"},
            "Total Vendido":{
                $sum:{
                    $multiply:["$Productos.cantidad","$Productos.precio"]
                }
            }
        }
    },
    {
        $group:{
            _id:{Vendedor:"$Vendedor"},
            "Productos":{$push:{
                nombre:"$_id.Producto",
                "cantidad vendida":"$Cantidad vendida",
                "total vendido producto":"$Total Vendido"
            }
            },
            "Total vendido vendedor":{$sum:"$Total Vendido"}
        }
    }
]).pretty()
{
        "_id" : {
                "Vendedor" : "Pepa"
        },
        "Productos" : [
                {
                        "nombre" : "cereales",
                        "cantidad vendida" : 2,
                        "total vendido producto" : 30000
                },
                {
                        "nombre" : "jabon",
                        "cantidad vendida" : 5,
                        "total vendido producto" : 5000
                }
        ],
        "Total vendido vendedor" : 35000
}
{
        "_id" : {
                "Vendedor" : "Juanito"
        },
        "Productos" : [
                {
                        "nombre" : "caja de cervezas",
                        "cantidad vendida" : 1,
                        "total vendido producto" : 60000
                },
                {
                        "nombre" : "Papel higienico",
                        "cantidad vendida" : 3,
                        "total vendido producto" : 36000
                }
        ],
        "Total vendido vendedor" : 96000
}
{
        "_id" : {
                "Vendedor" : "Panchito"
        },
        "Productos" : [
                {
                        "nombre" : "Cepillo dental",
                        "cantidad vendida" : 2,
                        "total vendido producto" : 10000
                }
        ],
        "Total vendido vendedor" : 10000
}
{
        "_id" : {
                "Vendedor" : "Pepito"
        },
        "Productos" : [
                {
                        "nombre" : "Crema dental",
                        "cantidad vendida" : 11,
                        "total vendido producto" : 132000
                }
        ],
        "Total vendido vendedor" : 132000
}

● Consultar la información del vendedor con más ventas de la tienda

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $group:{
            _id: {"Producto":"$Productos.nombre"},
            "Total Vendido":{
                $sum:{
                    $multiply:["$Productos.cantidad","$Productos.precio"]
                }
            }
        }
    },
    {
        $lookup:
        {
            from:"inventario",
            let:{producto:"$_id.Producto"},
            pipeline:[
                {
                    $match:
                    {
                        $expr:
                        {
                            $eq:["$$producto","$nombre producto"]
                        }
                    }
                },
                {
                    $project:{
                        nombre:"$vendedor.nombre",
                        "teléfonos" :"$vendedor.teléfonos",
                        "dirección" :"$vendedor.dirección",
                        "ciudad de residencia":"$vendedor.ciudad de residencia",
                        "calificación por ventas" :"$vendedor.calificación por ventas",
                        _id:0
                    }
                }
            ],
            as:"Vendedor"
        }
    },
    {
        $unwind:"$Vendedor"
    },
    {
        $group:{
            _id:{Vendedor:"$Vendedor.nombre"},
            info:{
                $first:{
                    "teléfonos" :"$Vendedor.teléfonos",
                    "dirección" :"$Vendedor.dirección",
                    "ciudad de residencia":"$Vendedor.ciudad de residencia",
                    "calificación por ventas" :"$Vendedor.calificación por ventas",
                }
            },
            "Total vendido vendedor":{$sum:"$Total Vendido"}
        }
    },
    {
        $sort:{"Total vendido vendedor":-1}
    },
    {
        $limit:1
    }
]).pretty()
{
        "_id" : {
                "Vendedor" : "Pepito"
        },
        "info" : {
                "teléfonos" : 123,
                "dirección" : "calle123",
                "ciudad de residencia" : "Medellin",
                "calificación por ventas" : 10
        },
        "Total vendido vendedor" : 132000
}

● Consultar los 5 productos más vendidos en la tienda en un mes específico

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $match:{
            $expr:{
                $and:[
                    {$eq:[{$month:"$Fecha"},12]},
                    {$eq:[{$year:"$Fecha"},2018]}
                ]
            }
        }
    },
    {
        $group:{
            _id:{
                mes:{$month:"$Fecha"},
                "año":{$year:"$Fecha"},
                "Producto":"$Productos.nombre"
            },
            "Cantidad vendida":{$sum:"$Productos.cantidad"}
        }
    },
    {
        $sort:{"Cantidad vendida":-1}
    },
    {
        $limit:5
    }
]).pretty()
{
        "_id" : {
                "mes" : 12,
                "año" : 2018,
                "Producto" : "Crema dental"
        },
        "Cantidad vendida" : 6
}
{
        "_id" : {
                "mes" : 12,
                "año" : 2018,
                "Producto" : "jabon"
        },
        "Cantidad vendida" : 5
}
{
        "_id" : {
                "mes" : 12,
                "año" : 2018,
                "Producto" : "Papel higienico"
        },
        "Cantidad vendida" : 3
}
{
        "_id" : {
                "mes" : 12,
                "año" : 2018,
                "Producto" : "caja de cervezas"
        },
        "Cantidad vendida" : 1
}

● Consultar el promedio de las ventas por mes de cada vendedor

db.ventas.aggregate([
    {
        $unwind:"$Productos"
    },
    {
        $group:{
            _id: {
                mes:{$month:"$Fecha"},
                "año":{$year:"$Fecha"},
                "Producto":"$Productos.nombre"
            },
            "Total Vendido":{
                $sum:{
                    $multiply:["$Productos.cantidad","$Productos.precio"]
                }
            }
        }
    },
    {
        $lookup:
        {
            from:"inventario",
            let:{producto:"$_id.Producto"},
            pipeline:[
                {
                    $match:
                    {
                        $expr:
                        {
                            $eq:["$$producto","$nombre producto"]
                        }
                    }
                },
                {
                    $project:{
                        nombre:"$vendedor.nombre",
                        _id:0
                    }
                }
            ],
            as:"Vendedor"
        }
    },
    {
        $unwind:"$Vendedor"
    },
    {
        $group:{
            _id:{"Vendedor":"$Vendedor.nombre",
                mes:"$mes",
                "año":"$año",
            },
            "Total mes":{$sum:"$Total Vendido"}
        }
    },
    {
        $group:{
            _id:{"Vendedor":"$_id.Vendedor"},
            "Promedio por mes":{$avg:"$Total mes"}
        }
    }
]).pretty()
{ "_id" : { "Vendedor" : "Pepa" }, "Promedio por mes" : 35000 }
{ "_id" : { "Vendedor" : "Juanito" }, "Promedio por mes" : 96000 }
{ "_id" : { "Vendedor" : "Panchito" }, "Promedio por mes" : 10000 }
{ "_id" : { "Vendedor" : "Pepito" }, "Promedio por mes" : 132000 }