Как подсчитать количество документов с одинаковым значением и сгруппировать их, используя другое поле в mongoDB? - PullRequest
1 голос
/ 27 мая 2020

Предположим, у меня есть несколько документов, таких как

{
    "_id" : ObjectId("5ecce1f9cb4a5d097c9061c8"),
    "job_id" : 1,
    "score" : 2
},
{
    "_id" : ObjectId("5ecce200cb4a5d097c9061cb"),
    "job_id" : 1,
    "score" : 1
},
{
    "_id" : ObjectId("5ecce206cb4a5d097c9061ce"),
    "job_id" : 1,
    "score" : 2
},
{
    "_id" : ObjectId("5ecce210cb4a5d097c9061d3"),
    "job_id" : 1,
    "score" : 0
},
{
    "_id" : ObjectId("5ecce21acb4a5d097c9061d6"),
    "job_id" : 2,
    "score" : 2
},
{
    "_id" : ObjectId("5ecce224cb4a5d097c9061df"),
    "job_id" : 2,
    "score" : 0
},
{
    "_id" : ObjectId("5ecce230cb4a5d097c9061e2"),
    "job_id" : 2,
    "score" : 0
},
{
    "_id" : ObjectId("5ecce239cb4a5d097c9061e5"),
    "job_id" : 2,
    "score" : 0
}

Как мне сгруппировать их в соответствии с их job_id и получить агрегированный результат с наличием оценок? Примерно так:

{
    "job_id": 1,
    "result": {
        0:1,
        1:1,
        2:2
    }
},
{
    "job_id": 2,
    "result": {
        0:3,
        2:1
    }
}

Поскольку в job_id 2, O встречается 3 раза, а 2 - 1 раз, отсюда и этот результат.

Я пробовал много разных методов и пытался выполнить группировку, но это не помогло не помогло.

1 Ответ

2 голосов
/ 27 мая 2020

Если вы используете Mon go версии 4.0+, вы можете использовать следующую агрегацию, которая использует $ arrayToObject для управления структурой данных. Причина, по которой нам нужен Mon go версия 4.0, - это использование $ toString в конвейере из-за ограничения ключей объекта, которые должны быть строковыми, чтобы $arrayToObject работал.

db.collection.aggregate([
    {
        $group: {
            _id: {job: "$job_id", score: "$score"},
            count: {$sum: 1}
        }
    },
    {
        $group: {
            _id: "$_id.job",
            scoreResults: {$push: {v: "$count", k: {$toString: "$_id.score"}}}
        }
    },
    {
        $project: {
            _id: 0,
            job_id: "$_id",
            result: {$arrayToObject: "$scoreResults"} 
        }
    }
])

В более старых версиях Mon go вам нужно будет либо выполнить окончательное преобразование структуры, которое было бы выполнено $arrayToObject в коде, либо изменить требуемый выходной формат, чтобы он стал возможной структурой для получения с помощью команд, доступных для этой версии Mon go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...