#mongodb
#mongodb
Вопрос:
У меня есть поля, group_id
, code
, revenue
. Я хочу сделать агрегацию, в которой доход группируется по group_id
и суммируется для каждого типа code
. Кроме того, некоторые из code
s будут объединены revenue
. Так, например, для code
s «abc» и «ghi» будет объединено revenue
с заголовком «agi». Как мне это сделать?
Если входные данные, подобные
[
{
"group_id": "ABC",
"revenue": 100,
"code": "abc"
},
{
"group_id": "ABC",
"revenue": 200,
"code": "abc"
},
{
"group_id": "ABC",
"revenue": 200,
"code": "def"
},
{
"group_id": "ABC1",
"revenue": 200,
"code": "def"
},
{
"group_id": "ABC",
"revenue": 200,
"code": "def"
},
{
"group_id": "ABC1",
"revenue": 200,
"code": "abc"
},
{
"group_id": "ABC",
"revenue": 200,
"code": "ghi"
}
]
тогда на выходе будет
[
{
"group_id": "ABC",
"expenses": [
{
"code": "agi",
"revenue": 500
},
{
"code": "def",
"revenue": 400
}
]
},
{
"group_id": "ABC1",
"expenses": [
{
"code": "abc",
"revenue": 200
},
{
"code": "def",
"revenue": 200
}
]
},
]
Ответ №1:
Затем группируйте по group_id
и code
вот так:
let combine = ["abc", "ghi"];
db.items.aggregate([
{
$addFields: {
code: {
$cond: {
if: { $in: ["$code", combine] },
then: "agi",
else: "$code"
}
}
}
},
{
$group: {
_id: {
group_id: "$group_id",
code: "$code"
},
revenue: { $sum: "$revenue" }
}
},
{
$group: {
_id: "$_id.group_id",
expenses: {
$push: {
code: "$_id.code",
revenue: "$revenue"
}
}
}
}
]);
Выходной сигнал
/* 1 */
{
"_id" : "ABC",
"expenses" : [
{
"code" : "def",
"revenue" : 400
},
{
"code" : "agi",
"revenue" : 500
}
]
},
/* 2 */
{
"_id" : "ABC1",
"expenses" : [
{
"code" : "def",
"revenue" : 200
},
{
"code" : "agi",
"revenue" : 200
}
]
}
Комментарии:
1. Это решает первую часть. Но вторая часть «некоторые из кодов будут иметь совокупный доход. Так, например, для кодов «abc» и «ghi» будет объединенный доход с заголовком «agi».» Как это будет сделано в самом запросе?
2. Как определить совокупный доход? Что указывает на то, что
abc
иghi
должно быть объединено?3. Это заранее определяется потребностями бизнеса. Итак, эти группы уже известны.
4.
agi
это просто переименование суммы, созданной путем группировкиabc
иghi
5. Да, это так. Спасибо.