Как создать несколько агрегатов, которые имеют разные фильтры в MongoDB?

#mongodb #mongodb-query #aggregation-framework

Вопрос:

Я новичок в MonogoDB, и мои данные следующие:

 {Country :India, Gender:M, Salary :100, Name:Kathis  }
{Country :Gulf, Gender:F, Salary :100, Name:Harika }
{Country :USA, Gender:M, Salary :300, Name:ALllt  }
{Country :Afr, Gender:M, Salary :400, Name:Surya  }
 

Результат должен быть:

 {Total Count:4, "Count of Gender":1, "Count of Salary":2, "Count of Name":1}
 

Объяснение вывода:

  • Общее количество: Общее количество стран по всем документам
  • Подсчет пола: Подсчитывайте пол только в том случае, если это » F » (поскольку есть только одна женщина, подсчет один).
  • Подсчет заработной платы: Подсчитайте заработную плату, если она превышает 200, следовательно, подсчет равен 2
  • Количество имен: если оно начинается с «А», то посчитайте его

Вещи, которые я пробовал:

 db.getCollection('Raw')..aggregate([
  {
    $facet: {
      "total Country": [{ $sum:1 }],
      "Count of Gender":[{$match:{"Gender":"F"}}]
       ........
    }
  }
])
 

Пожалуйста, дайте мне знать, является ли этот процесс правильным или неправильным?

Ответ №1:

Пожалуйста, дайте мне знать, является ли этот процесс правильным или неправильным?

Да, это тоже правильный подход, но он зависит от количества документов в коллекции, ниже я объяснил другой подход, вы можете протестировать оба и проверить производительность, используя метод состояния explain ().,

Вы можете использовать $group этап для подсчета в соответствии с вашими условиями,

  • $group по нулю
  • получите общее количество, используя сумму в$: 1
  • получите количество полов, проверьте условие, если Gender равно F, то сумма 1
  • получите подсчет зарплаты, проверьте условие, если Salary больше 200, то сумма 1
  • получите количество имен, проверьте соответствие регулярному выражению, если Name начать с «А», затем суммируйте 1
 db.getCollection('Raw')..aggregate([
  {
    $group: {
      _id: null,
      totalCount: { $sum: 1 },
      genderCount: {
        $sum: { $cond: [{ $eq: ["$Gender", "F"] }, 1, 0] }
      },
      salaryCount: {
        $sum: { $cond: [{ $gt: ["$Salary", 200] }, 1, 0] }
      },
      nameCount: {
        $sum: { $cond: [{ $regexMatch: { input: "$Name", regex: "^A" } }, 1, 0] }
      }
    }
  }
])
 

Игровая площадка