Агрегирование Mongo и подсчет по n полям

У меня проблемы с пониманием структуры агрегации MongoDB. В основном мой JSON выглядит так:

[
  {
    "id": 1,
    "param1": true,
    "param2": false,
    "param3": false
  },
  {
    "id": 2,
    "param1": true,
    "param2": false,
    "param3": true
  },
  {
    "id": 3,
    "param1": false,
    "param2": true,
    "param3": false
  }
]

Я хочу посчитать, сколько документов имеют, например, param1 == true, param2 == true и так далее. В этом случае ожидаемый результат должен быть:

count_param1: 2
count_param2: 1
count_param3: 1

Хитрость здесь в том, что param может быть param1 .. paramN, поэтому в основном мне нужно либо сделать отдельное и точно указать, какие поля меня интересуют, либо я могу «сгруппировать» все поля, начинающиеся с «param».

Каков рекомендуемый подход?


Дальнейшее объяснение:

Эквивалентом SQL было бы сделать:

SELECT COUNT(param1) AS param1
FROM [Table]
GROUP BY param1

Для каждого столбца (но в одном запросе).


person Norrin    schedule 17.10.2014    source источник


Ответы (2)


Я бы не стал использовать агрегацию, так как есть встроенный помощник count( ) для этого:

> db.collection.count({ "param1" : true })

Вы можете создать простую функцию, которая принимает имя параметра в качестве аргумента и возвращает количество:

> param_count = function(param_name) {
    count_obj = {}
    count_obj[param_name] = true
    return db.collection.count(count_obj)
}

Хотя технически возможно получить количество всех параметров в одном конвейере агрегации, это невозможно для более чем 1 миллиона строк, и будет лучше сделать один конвейер агрегации для каждого имени параметра. Я не очень хорошо разбираюсь в SQL, но я предполагаю, что когда вы даете эквивалент SQL и говорите, что сделаете их все в «одном запросе», вы имеете в виду, что отправите один пакет SQL, но по сути это будет конкатенация различных запросов для группировки и подсчета, так что это не сильно отличается от решения, которое я дал.

Счетчик может использовать индекс paramN, если он существует.

person wdberkeley    schedule 17.10.2014
comment
Пробовал. Один param_count без индекса в БД с 300 000 документов занял 0,2 с. Слишком медленно. - person Norrin; 17.10.2014

Это было решено. Ознакомьтесь с моим связанным вопросом и отличным ответом Крисдам.

Идеальное решение для моих нужд.

person Norrin    schedule 08.05.2015