Создать новую коллекцию, изменив представление данных - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть коллекция сотрудников mongo с информацией об отделе в виде вложенного документа.

Пример:

{
    "_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"
    }
}

Теперь мне нужно создать новую коллекцию, используя коллекцию сотрудников, чтобы информация об отделе имела видroot с массивом сотрудников этого отдела.

Пример:

{
    "_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"...
    }]
}

1 Ответ

1 голос
/ 30 сентября 2019

Следующий запрос может дать нам ожидаемый результат:

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()

Набор данных:

{
    "_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"
    }
}

Коллекция: отдел

{
    "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
        }
    ]
}
...