#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] }
}
}
}
])