2016-03-30 2 views
2

Так что я пытаюсь сделать, чтобы получить несколько отсчетов одного поля в зависимости от значения min max. Коллекция держит что-то вродеКак получить несколько счетчиков в одном запросе для одного поля?

{name:'hi',price:100}, 
{name:'hi',price:134}, 
{name:'hi',price:500} 

Что я хочу, чтобы получить это, например, подсчет элементов, которые между ценой 100-200, 200-300, 300-400, 400-500.

Есть ли способ сделать это в mongoDB с одним запросом? Есть ли способ получить запрос без знания min max?

ответ

1

Вы хотите .aggregate() здесь с тройным оператором $cond для определения жгутов группировки ID $group:

db.collection.aggregate([ 
    { "$match": { 
     "price": { "$gte": 100, "$lte" 500 } 
    }}, 
    { "$group": { 
     "_id": { 
      "$cond": [ 
       { "$lte": [ "$price", 200 ] }, 
       "100-200", 
       { "$cond": [ 
        { "$lte": [ "$price", 300 ] }, 
        "200-300", 
        { "$cond": [ 
         { "$lte": [ "$price", 400 ] }, 
         "300-400", 
         "400-500" 
        ]} 
       ]} 
      ] 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

Как «тройной» if/then/else$cond будет оценивать выражение в качестве первого аргумента «если» и то либо возвратите второй аргумент «then», где true, либо третий «else», где false.

Каскадная логика означает, что вы «гнездо» каждой тройной операции внутри утверждения false, пока не достигнете конечного результата.

С учетом группировки _id, вы используете только $sum с аргументом 1, чтобы «подсчитать» совпадения в группе.

Это дает ответ на образец, как:

{ "_id": "100-200", "count": 2 } 
{ "_id": "400-500", "count": 1 } 

$match убедившись, что все результаты находятся в «диапазоне», что Виль быть проверены. Если вы исключаете это, тогда вам, скорее всего, понадобится последнее условие «else», чтобы вернуть другое значение, если "price" был за пределами ожидаемого «диапазона».

Если вы хотите вернуть «каждый» диапазон, то вам лучше проверить результат и вставить запись счетчика 0 для каждого диапазона, который не возвращается.

+0

Что делать, если я не знаю min и max, и я хочу получить 5 значений между min и max. Пример min - 1000, а max - 5000. Могу ли я автоматически сделать запрос, который будет подсчитываться между этими числами? – Marcio

+0

@Marcio Пожалуйста, прочтите. Я точно сказал это дело в ответе. Просто верните условие «последний» '$ cond'« else »с« Unknown ». Ничто не собирается «генерировать» диапазоны для вас, если это то, о чем вы просите. Вы должны указать каждое условие для '$ cond'. «$ Match», как отмечено, является просто «оптимизацией» и не требуется. –

Смежные вопросы