Mongodb Query Aggregation и Groupby комплексный фильтр, сумма, процентный запрос - PullRequest
0 голосов
/ 06 ноября 2019

У меня сложный групповой запрос.

Данные следующие:

enter image description here

Агрегирование следующим образом:

  1. совпадение по doc_id
  2. группировка по имени
  3. project: name, name_count, amount, desc as {value: определяется по максимальной сумме суммы в этом списке desc,count: сумма (процентов * 100) ^ 2, процентов: его процент с учетом количества в этом списке}
  4. то же самое с L1 и L2. Но на L1 L2 ссылаются поля {_id, name} из другой коллекции. Итак, мне нужно спроецировать как _id, name, так и то, что я делаю в пункте 3 выше.

Поэтому после выполнения скажем, что результат будет:

...
},
"_id" : {
        "name" : "abc"
    }, 
    "amount" : 45.0, 
    "count" : 4.0, 
    "desc" : {
            "value" : "Laptop",  // based on highest sum amount in group:'abc' i.e. 25.0 for laptop
            "count" : 5061.72, // (56*100)^2 + (44*100)^2
            "percent" :  25.0*100/45.0 = 56.0
        }, 
...

Ссылка на тестовые данные: MonogoDb Playground

Udpated: 07/11/2019

Добавлен пример для подсчета количества

enter image description here

Надеюсь, я все понял. Пожалуйста, помогите.

1 Ответ

2 голосов
/ 06 ноября 2019

Не понимаю вычисления, необходимые для подсчета. Тем не менее, вот запрос, который вы можете использовать, чтобы удовлетворить ваши потребности:

db.collection.aggregate([
  {
    $match: {
      "doc_id": 1
    }
  },
  {
    $group: {
      _id: {
        name: "$name",
        desc: "$desc"
      },
      amount: {
        $sum: "$amount"
      },
      count: {
        $sum: 1
      },

    }
  },
  {
    $sort: {
      "_id.name": 1,
      "amount": -1
    }
  },
  {
    $group: {
      _id: "$_id.name",
      amount: {
        $sum: "$amount"
      },
      count: {
        $sum: "$count"
      },
      desc: {
        $first: {
          value: "$_id.desc",
          descAmount: "$amount"
        }
      }
    },

  },
  {
    $addFields: {
      "desc.percent": {
        $multiply: [
          {
            $divide: [
              "$desc.descAmount",
              "$amount"
            ]
          },
          100
        ]
      }
    }
  }
])

Совет состоит в том, чтобы группировать дважды, с сортировкой между ними, чтобы получить промежуточный итог и первый элемент (тот, который имеет самый большой вложенный элемент). итого по каждому имени). Теперь вы можете адаптировать подсчет по своему усмотрению.

Вы можете проверить его здесь .

...