Агрегирование Mongodb в формате JSON по месяцам - PullRequest
0 голосов
/ 04 февраля 2019

Здравствуйте, я работаю с API отчетности, который собираюсь использовать в старших чартах, и я новичок в mongodb.

Ниже приведен мой запрос агрегации (предложите мне модификацию):

db.product_sold.aggregate({

    $group: {
        _id: { year: { $year: "$solddate" }, month: { $month: "$solddate" }, productid: "$productid" },
        totalQty: { $sum: "$qty" }
    }

})

Вывод:

{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(2), 
        "productid" : "11"
    }, 
    "totalQty" : 6.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(2), 
        "productid" : "14"
    }, 
    "totalQty" : 7.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(1), 
        "productid" : "13"
    }, 
    "totalQty" : 3.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(2), 
        "productid" : "10"
    }, 
    "totalQty" : 6.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2018), 
        "month" : NumberInt(2), 
        "productid" : "12"
    }, 
    "totalQty" : 5.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(2), 
        "productid" : "15"
    }, 
    "totalQty" : 8.0
}
// ----------------------------------------------
{ 
    "_id" : {
        "year" : NumberInt(2019), 
        "month" : NumberInt(1), 
        "productid" : "11"
    }, 
    "totalQty" : 2.0
}
// ----------------------------------------------

То, что я хочу в выводе, выглядит примерно так:

status: 200,
msg: "SUCCESS"
data: [{
    1:[
        {
            "productid": 11,
            "totalQty": 3
        },
        {
            "productid": 12,
            "totalQty": 27
        }
    ],

    2:[
        {
            "productid": 11,
            "totalQty": 64
        },
        {
            "productid": 12,
            "totalQty": 10
        }
    ]   
}]

Для справки прикрепление изображения коллекции

enter image description here

Есть ли способ добиться этого с помощью агрегации или чего-либо еще, или мне придется делать это вручную с помощью кода?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете добавить следующие этапы агрегации к вашему текущему конвейеру:

db.product_sold.aggregate([
    // your current $group stage
    {
        $group: {
            _id: "$_id.month",
            docs: { $push: { productid: "$_id.productid", totalQty: "$totalQty" } }
        }
    },
    {
        $project: {
            _id: 0,
            k: { $toString: "$_id" },
            v: "$docs"
        }
    },
    {
        $group: {
            _id: null,
            data: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            _id: 0,
            data: { $arrayToObject: "$data" }
        }
    }
])

Идея в том, что вы можете использовать $ group с _id, установленным на null, чтобы получитьвсе данные в один документ, а затем используйте $ arrayToObject , чтобы получить номер месяца в качестве ключа и все агрегаты за этот месяц в качестве значения.

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