Eri nel posto giusto, ma come $cond
richiede tre argomenti (essendo la valutazione, il risultato vero e il risultato falso) devi "nidificare" queste operazioni, che ogni successivo $cond
come false
condizione. Quindi la tua sintassi qui è un po' storta.
Puoi anche farlo solo nel $group
per evitare di passare attraverso l'intera raccolta con un $project
. In base alla struttura del documento che fornisci come esempio, formeresti in questo modo:
$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 )
)
)
);
Notando inoltre che gli operatori di confronto logico come $lt
funzionano in modo diverso in queste fasi rispetto alle loro controparti di query. Essi stessi prendono una serie di argomenti come valori da testare e confrontare. Restituiscono true/false
in base a quel confronto, che è il requisito per il primo argomento di $cond
.
Sempre utile avere un json_encode
da qualche parte in cui stai eseguendo il debug della forma di query della pipeline, poiché JSON sarà l'ambito generale degli esempi:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Che produce la struttura JSON comune:
[
{ "$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 }
}}
]