Estabas en el lugar correcto, pero como $cond
requiere tres argumentos (siendo la evaluación, el resultado verdadero y el resultado falso) necesita "anidar" estas operaciones, cada una $cond
subsiguiente como el false
condición. Así que su sintaxis aquí está un poco fuera de lugar.
También puede hacer esto solo en el $group
para evitar pasar por toda la colección con un $project
. Según la estructura del documento que das como ejemplo, formarías así:
$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 )
)
)
);
También tenga en cuenta que los operadores de comparación lógica como $lt
funcionan de manera diferente en estas etapas a sus contrapartes de consulta. Ellos mismos toman una serie de argumentos que son los valores para probar y comparar. Devuelven true/false
basado en esa comparación, que es el requisito para el primer argumento de $cond
.
Siempre útil tener un json_encode
en algún lugar donde esté depurando el formulario de consultas de canalización, ya que JSON será el alcance general de los ejemplos:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Lo que produce la estructura JSON común:
[
{ "$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 }
}}
]