sql >> Base de Datos >  >> RDS >> Mysql

Consultas agregadas de MongoDB frente a MySQL SELECT field1 FROM table

Los empleados son entidades únicas; por lo tanto, probablemente no quieras modelar age de un miembro del equipo tan profundamente en la rica estructura de departamentos y ubicaciones y equipos. Está perfectamente bien tener employees separados colección y simplemente hacer:

db.businesses.aggregate([
{$match: {"age": {$gt: 50} }}
,{$sort: {"age": -1} }
]);

En lo profundo de sus businesses colección que puedes tener:

{ teams: [ {name: "T1", employees: [ "E1", "E34" ]} ] }

Alternativamente, intente esto:

db.businesses.aggregate([ your pipeline] ,{allowDiskUse:true});

El OP tiene una configuración de 10 biz -> 10 loc -> 10 departamentos -> 10 equipos -> 100 emps. Los primeros 3 desenrollados crean una explosión de datos de 10000x, pero el último es 100x más allá. Podemos reducir el hit usando $filter :

db.businesses.aggregate([
{ $unwind: "$locations" },
{ $unwind: "$locations.departments" },
{ $unwind: "$locations.departments.teams" },

{$project: {
        XX: {$filter: {
                    input: "$locations.departments.teams.employees",
                    as: "z",
                    cond: {$gte: [ "$$z.age", 50] }
            }}
    }}
,{$unwind: "$XX"}
,{$sort: {"XX.age":-1}}])