Tengo la colección de empleados de mongo con información del departamento como un documento anidado.

Ejemplo:

{
    "_id": 7934,
    "ename": "MILLER",
    "job": "CLERK",
    "mgr": "7782",
    "hiredate": ISODate("1982-01-22T18:30:00Z"),
    "sal": 1300,
    "department": {
        "deptno": 10,
        "dname": "ACCOUNTING",
        "loc": "NEW YORK"
    }
}

Ahora tengo que crear una nueva colección utilizando la colección de empleados para tener la información del departamento como raíz con una serie de empleados de ese departamento.

Ejemplo:

{
    "_id": 10,
    "deptno": 10,
    "dname": "ACCOUNTING",
    "loc": "NEW YORK",
    "employees": [{
        "ename": "MILLER",
        "job": "CLERK",
        "mgr": "7782",
        "hiredate": ISODate("1982-01-22T18:30:00Z"),
        "sal": 1300
    }, {
        "ename": "JOHN"...
    }]
}
0
Madhuprathap 30 sep. 2019 a las 11:51

1 respuesta

La mejor respuesta

La siguiente consulta puede obtener el resultado esperado:

db.collection.aggregate([
    {
        $group:{
            "_id":"$department.deptno",
            "department":{
                $first:"$department"
            },
            "employees":{
                $push:"$$ROOT"
            }
        }
    },
    {
        $replaceRoot:{
            "newRoot":{
                $mergeObjects:[
                    "$department",
                    {
                        "employees":"$employees"
                    }
                ]
            }
        }
    },
    {
        $project:{
            "employees.department":0
        }
    },
    {
        $out:"department"
    }
]).pretty()

Conjunto de datos:

{
    "_id" : 7934,
    "ename" : "MILLER",
    "job" : "CLERK",
    "mgr" : "7782",
    "hiredate" : ISODate("1982-01-22T18:30:00Z"),
    "sal" : 1300,
    "department" : {
        "deptno" : 10,
        "dname" : "ACCOUNTING",
        "loc" : "NEW YORK"
    }
}
{
    "_id" : 7935,
    "ename" : "MECHANIC",
    "job" : "CEO",
    "mgr" : "7700",
    "hiredate" : ISODate("1982-01-22T18:30:00Z"),
    "sal" : 9999999999999,
    "department" : {
        "deptno" : 10,
        "dname" : "ACCOUNTING",
        "loc" : "NEW YORK"
    }
}

Colección: departamento

{
    "deptno" : 10,
    "dname" : "ACCOUNTING",
    "loc" : "NEW YORK",
    "employees" : [
        {
            "_id" : 7934,
            "ename" : "MILLER",
            "job" : "CLERK",
            "mgr" : "7782",
            "hiredate" : ISODate("1982-01-22T18:30:00Z"),
            "sal" : 1300
        },
        {
            "_id" : 7935,
            "ename" : "MECHANIC",
            "job" : "CEO",
            "mgr" : "7700",
            "hiredate" : ISODate("1982-01-22T18:30:00Z"),
            "sal" : 9999999999999
        }
    ]
}
1
Himanshu Sharma 30 sep. 2019 a las 09:48