Vous étiez au bon endroit, mais en tant que $cond
nécessite trois arguments (étant l'évaluation, le résultat vrai et le résultat faux), vous devez "imbriquer" ces opérations, que chaque $cond
suivant comme le false
condition. Donc, votre syntaxe ici est un peu décalée.
Vous pouvez également le faire uniquement dans le $group
pour éviter de parcourir toute la collection avec un $project
. Sur la base de la structure de document que vous donnez comme exemple, vous formeriez comme ceci :
$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 )
)
)
);
Notez également que les opérateurs de comparaison logiques tels que $lt
fonctionnent différemment à ces étapes de leurs homologues de requête. Ils prennent eux-mêmes un tableau d'arguments étant les valeurs à tester et à comparer. Ils renvoient true/false
basé sur cette comparaison, qui est l'exigence pour le premier argument de $cond
.
Toujours pratique d'avoir un json_encode
quelque part où vous déboguez le formulaire des requêtes de pipeline, car JSON sera la portée générale des exemples :
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Ce qui donne la structure JSON commune :
[
{ "$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 }
}}
]