Je was op de juiste plaats, maar als $cond
vereist drie argumenten (zijnde de evaluatie , het ware resultaat en het valse resultaat) u moet deze bewerkingen "nesten", die elke volgende $cond
als de false
voorwaarde. Dus je syntaxis is hier een beetje verkeerd.
Je kunt dit ook gewoon doen in de $group
om te voorkomen dat u de hele collectie doorloopt met een aparte $project
. Op basis van de documentstructuur die u als voorbeeld geeft, zou u zich als volgt vormen:
$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 )
)
)
);
Merk ook op dat logische vergelijkingsoperatoren zoals $lt
werken in deze fasen anders dan hun tegenhangers voor zoekopdrachten. Ze nemen zelf een reeks argumenten als de waarden om te testen en te vergelijken. Ze retourneren true/false
gebaseerd op die vergelijking, wat de vereiste is voor het eerste argument voor $cond
.
Altijd handig om een json_encode
. te hebben ergens waar u de vorm van pijplijnquery's debugt, aangezien JSON het algemene bereik van voorbeelden zal zijn:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Wat de gemeenschappelijke JSON-structuur oplevert:
[
{ "$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 }
}}
]