Du var på rätt plats, men som $cond
kräver tre argument (som är utvärderingen , sant resultat och falskt resultat) måste du "kapsla" dessa operationer, som varje efterföljande $cond
som false
skick. Så din syntax här är lite dålig.
Du kan också göra detta bara i $group
för att undvika att gå igenom hela samlingen med en separat $project
. Baserat på dokumentstrukturen du ger som exempel skulle du bilda så här:
$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 )
)
)
);
Notera också att logiska jämförelseoperatorer som $lt
fungerar annorlunda i dessa stadier än sina frågemotsvarigheter. De tar själva en rad argument som de värden som ska testas och jämföras. De returnerar true/false
baserat på den jämförelsen, vilket är kravet för det första argumentet till $cond
.
Alltid praktiskt att ha en json_encode
någonstans där du felsöker formen av pipeline-frågor, eftersom JSON kommer att vara den allmänna omfattningen av exempel:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Vilket ger den gemensamma JSON-strukturen:
[
{ "$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 }
}}
]