Du var på det rigtige sted, men som $cond
kræver tre argumenter (som er evalueringen , sandt resultat og falsk resultat), skal du "indlejre" disse operationer, som hver efterfølgende $cond
som false
tilstand. Så din syntaks her er lidt forkert.
Du kan også gøre dette bare i $group
for at undgå at gå gennem hele samlingen med en separat $project
. Baseret på den dokumentstruktur, du giver som eksempel, vil du danne sådan:
$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 )
)
)
);
Bemærk også, at logiske sammenligningsoperatorer såsom $lt
arbejde anderledes i disse stadier end deres forespørgselsmodparter. De tager selv en række argumenter som værdier til at teste og sammenligne. De returnerer true/false
baseret på den sammenligning, som er kravet til det første argument til $cond
.
Altid praktisk at have en json_encode
et sted, hvor du fejlretter formen af pipeline-forespørgsler, da JSON vil være det generelle omfang af eksempler:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Hvilket giver den fælles JSON-struktur:
[
{ "$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 }
}}
]