Группа MongoDB в сочетании с несколькими суммами и совпадением

#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. Да, это так. Спасибо.