Bạn đã đến đúng nơi, nhưng là $cond
yêu cầu ba đối số (là đánh giá, kết quả đúng và kết quả sai), bạn cần phải "lồng" các hoạt động này, mỗi phép toán $cond
tiếp theo dưới dạng false
tình trạng. Vì vậy, cú pháp của bạn ở đây hơi sai.
Bạn cũng có thể thực hiện việc này chỉ trong nhóm $group
để tránh chuyển qua toàn bộ bộ sưu tập bằng $project
. Dựa trên cấu trúc tài liệu bạn đưa ra làm ví dụ, bạn sẽ tạo thành như sau:
$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 )
)
)
);
Cũng lưu ý rằng các toán tử so sánh logic như $lt
hoạt động khác nhau trong các giai đoạn này với các đối tác truy vấn của chúng. Bản thân chúng lấy một mảng đối số là giá trị để kiểm tra và so sánh. Chúng trả về true/false
dựa trên so sánh đó, là yêu cầu đối với đối số đầu tiên cho $cond
.
Luôn có sẵn json_encode
ở đâu đó bạn đang gỡ lỗi dạng truy vấn đường ống, vì JSON sẽ là phạm vi chung của các ví dụ:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Điều này mang lại cấu trúc JSON chung:
[
{ "$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 }
}}
]