Вы хотите .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
для каждого диапазона, который не возвращается.
Что делать, если я не знаю min и max, и я хочу получить 5 значений между min и max. Пример min - 1000, а max - 5000. Могу ли я автоматически сделать запрос, который будет подсчитываться между этими числами? – Marcio
@Marcio Пожалуйста, прочтите. Я точно сказал это дело в ответе. Просто верните условие «последний» '$ cond'« else »с« Unknown ». Ничто не собирается «генерировать» диапазоны для вас, если это то, о чем вы просите. Вы должны указать каждое условие для '$ cond'. «$ Match», как отмечено, является просто «оптимизацией» и не требуется. –