Byłeś we właściwym miejscu, ale jako $cond
wymaga trzech argumentów (będących wartością , wynikiem prawdziwym i wynikiem fałszywym) należy "zagnieździć" te operacje, które każda kolejna $cond
jako false
stan. Więc twoja składnia tutaj jest trochę niewłaściwa.
Możesz to również zrobić w $group
aby uniknąć przechodzenia przez całą kolekcję z oddzielnym $project
. W oparciu o strukturę dokumentu, którą podajesz jako przykład, możesz utworzyć następujący wzó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 )
)
)
);
Zauważając również, że operatory porównania logicznego, takie jak $lt
działają na tych etapach inaczej niż ich odpowiedniki w zapytaniu. Same przyjmują szereg argumentów będących wartościami do przetestowania i porównania. Zwracają true/false
na podstawie tego porównania, które jest wymagane dla pierwszego argumentu $cond
.
Zawsze pod ręką, aby mieć json_encode
gdzieś, gdzie debugujesz formę zapytań potoku, ponieważ JSON będzie ogólnym zakresem przykładów:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Co daje wspólną strukturę JSON:
[
{ "$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 }
}}
]