@qovalenko

Как правильно оптимизировать запрос в MongoDB?

Документы имеют следующую структуру:
{
  "oneCategory" : "...",
  "twoCategory" : "...",
  "threeCategory" : "...",
  "fourCategory" : "...",
  "fiveCategory" : "...",
  "count" : 5
}

Сейчас у меня несколько запросов:
  1. Группировкой получить сумму count oneCategory получается (Тарелки: 500, Чашки: 100)
  2. Получить количество twoCategory, где oneCategory = Тарелки получается (Синих: 200, Красных: 60, Желтых: 240)
  3. Получить количество threeCategory, где oneCategory = Тарелки, а twoCategory = Желтые получается (С рисунком: 150, без рисунка: 90)
  4. Получить количество fourCategory, где oneCategory = Тарелки, а twoCategory = Желтые, threeCategory = С рисунком получается (Квадратные: 50, Круглые: 100)
  5. Получить количество fiveCategory, где oneCategory = Тарелки, а twoCategory = Желтые, threeCategory = С рисунком, fourCategory = Круглые получается (Стекло: 50, Глина: 50)

Как теперь это составить в один запрос. Спасибо!!!
Целью является получить все значения, полученные в ходе обработки, а не только результат в 5 шаге
  • Вопрос задан
  • 180 просмотров
Решения вопроса 2
@forspamonly2
фасетный поиск у монги теперь есть встроенный в агрегационный фреймворк: $facet
Ответ написан
@qovalenko Автор вопроса
Добавил выборку по дате
.aggregate(
    [
        {$match: {$and: [{ Date: { $gte: 1556799231792 } }, { Date: { $lte: 1556799231793 } }]}},
        {
            $facet: {
                "oneCategory": [{
                    $group: {
                        _id: "$oneCategory",
                        count: {$sum: "$Count"}
                    }
                }],
                "twoCategory": [
                    {$match: {oneCategory: "Тарелки"}},
                    {
                        $group: {
                            _id: {twoCategory: "$twoCategory"},
                            count: {$sum: "$Count"}
                        }
                    }],
                "threeCategory": [
                    {$match: {$and: [{oneCategory: "Тарелки"}, {twoCategory: "Желтые"}]}},
                    {
                        $group: {
                            _id:  "$threeCategory",
                            count: {$sum: "$Count"}
                        }
                    }],
                "fourCategory": [
                    {$match: {$and: [{oneCategory: "Тарелки"}, {twoCategory: "Желтые "}, {threeCategory: "С рисунком"}]}},
                    {
                        $group: {
                            _id:  "$fourCategory",
                            count: {$sum: "$Count"}
                        }
                    }],
                "fiveCategory": [
                    {$match: {$and: [{oneCategory: "Тарелки"}, {twoCategory: "Желтые "}, {threeCategory: "С рисунком"}, {fourCategory: "Круглые"}]}},
                    {
                        $group: {
                            _id:  "$fiveCategory",
                            count: {$sum: "$Count"}
                        }
                    }]
            }
        }
    ]
)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы