Бяхте на правилното място, но като $cond
изисква три аргумента (които са оценката, верен резултат и неверен резултат), трябва да "вложите" тези операции, които всяка следваща $cond
като false
състояние. Така че вашият синтаксис тук е малко неправилен.
Можете също да направите това само в $group
за да избегнете преминаването през цялата колекция с отделен $project
. Въз основа на структурата на документа, която давате като пример, бихте формирали така:
$pipeline = array(
array(
'$group' => array(
'_id' => array(
'$cond' => array(
array('$lt' => array( '$age', 18 )),
'age_0_17',
array(
'$cond' => array(
array( '$lte' => array( '$age', 25 )),
'age_18_25',
array(
'$cond' => array(
array( '$lte' => array ( '$age', 32 )),
'age_26_32',
'age_Above_32'
)
)
)
)
)
),
'count' => array( '$sum' => 1 )
)
)
);
Също така отбелязваме, че операторите за логическо сравнение като $lt
работят по различен начин на тези етапи в сравнение със съответните им заявки. Те самите приемат набор от аргументи, които са стойностите за тестване и сравнение. Те връщат true/false
въз основа на това сравнение, което е изискването за първия аргумент на $cond
.
Винаги е удобно да имате json_encode
някъде, където отстранявате грешки във формата на конвейерни заявки, тъй като JSON ще бъде общият обхват на примерите:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Което дава общата JSON структура:
[
{ "$group": {
"_id": {
"$cond":[
{ "$lt":["$age",18] },
"age_0_17",
{ "$cond":[
{ "$lte":["$age",25] },
"age_18_25",
{ "$cond":[
{ "$lte":["$age",32] },
"age_26_32",
"age_Above_32"
]}
]}
]
},
"count":{ "$sum": 1 }
}}
]