Как я могу сгруппировать данные в mogodb плюс объединить два поля в одно поле? - PullRequest
0 голосов
/ 19 января 2020

Можно ли как-нибудь получить отсюда:

{ "_id" : { "name" : "User1", "dept" : "A", "Code" : "Code1", "count" : 4 } }

{ "_id" : { "name" : "User2", "dept" : "B", "Code" : "Code1", "count" : 7 } }

{ "_id" : { "name" : "User1", "dept" : "A", "Code" : "Code2", "count" : 4 } }

сюда:

{ "_id" : { "name" : "User1", "dept" : "A", "Code1" : "4", "Code2": "4" }}

{ "_id" : { "name" : "User2", "dept" : "B", "Code1" : "7" }}

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

1 Ответ

0 голосов
/ 19 января 2020

Вы можете попробовать это:

db.yourCollectionName.aggregate([{
    $group: {
        _id: { name: '$_id.name', dept: '$_id.dept' },
        data: { $push: { $split: [{ $concat: ["$_id.Code", ",", { $toString: "$_id.count" }] }, ','] } }
    }
},
{
    $replaceRoot: { newRoot: { $mergeObjects: ['$_id', { $arrayToObject: "$data" }] } }
}])

Объяснение:

  1. Здесь мы группируемся по name & dept плюс выполняем конкатенацию Code & count в виде строки и разбиение этих двух элементов на массив.
  2. Затем мы конвертируем массив data в объект, объединяем его с _id объектом и делаем конечный объект новым root.

Проверьте это здесь: MongoDB-Playground

Выше вы получите требуемый вывод, но если вы хотите значения "Code1" : "4", "Code2": "4" как числа вместо строки, поскольку входной документ имеет count тип поля как int, затем попробуйте это:

db.yourCollectionName.aggregate([{
    $group: {
        _id: { name: '$_id.name', dept: '$_id.dept' },
        data: { $push: { $split: [{ $concat: ["$_id.Code", ",", { $toString: "$_id.count" }] }, ','] } }
    }
}, {
    $addFields: {
        data: {
            $map:
            {
                input: "$data",
                as: "each",
                in: [{ $arrayElemAt: ['$$each', 0] }, { $toInt: { $arrayElemAt: ['$$each', 1] } }]
            }
        }
    }
},
{
    $replaceRoot: { newRoot: { $mergeObjects: ['$_id', { $arrayToObject: "$data" }] } }
}])

Только изменение будет, поскольку мы преобразовали поле count из числа в строку в $group этап для объединения, мы преобразуем его обратно в число.

Проверьте это здесь: MongoDB-Playground

...