Você estava no lugar certo, mas como
$cond
requer três argumentos (sendo a avaliação , resultado verdadeiro e resultado falso) você precisa "aninhar" essas operações, que cada $cond
subsequente como o false
doença. Portanto, sua sintaxe aqui está um pouco errada. Você também pode fazer isso apenas no
$group
para evitar passar por toda a coleção com um $project
. Com base na estrutura do documento que você dá como exemplo, você formaria assim:$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 )
)
)
);
Observando também que operadores de comparação lógica como
$lt
funcionam de forma diferente nestes estágios para suas contrapartes de consulta. Eles mesmos pegam uma série de argumentos sendo os valores para testar e comparar. Eles retornam true/false
com base nessa comparação, que é o requisito para o primeiro argumento para $cond
. Sempre útil ter um
json_encode
em algum lugar onde você está depurando o formulário de consultas de pipeline, pois JSON será o escopo geral dos exemplos:echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
O que produz a estrutura JSON comum:
[
{ "$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 }
}}
]