Với các bản phát hành hiện đại (kể từ MongoDB 3.4), bạn sẽ sử dụng $ switch
, về cơ bản là bản sao của switch
hoặc trường hợp
từ khóa trong triển khai ngôn ngữ khác:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$switch": {
"branches": [
{ "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
{ "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
],
"default": 10
}
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
])
Điều này tránh lồng vào nhau if..then..else
các điều kiện có thể được thực hiện bằng cách sử dụng $ cond
và hiển thị bên dưới. Nhưng bên dưới vẫn hiển thị như một ví dụ rằng điều này luôn có thể được thực hiện, ngay cả trước toán tử mới của ngay cả if..then..else
rõ ràng từ khóa vì ký hiệu mảng ban đầu luôn duy trì cú pháp đó.
Cũng lưu ý rằng một mảng các điều kiện ở đây thường cũng dễ dàng hơn rất nhiều để xây dựng theo chương trình so với việc tạo một lồng nhau cấu trúc dữ liệu cho câu lệnh khi cần thiết với $ cond
.
if..then..else
từ khóa đến $ cond
toán tử chỉ là một bổ sung gần đây cho các phiên bản gần đây của MongoDB tại thời điểm viết bài (MongoDB 2.6 là phần giới thiệu của từ khóa . Nhà điều hành thực tế đã có sẵn với việc phát hành khung tổng hợp trong MongoDB 2.2). Ý định là rõ ràng nhưng trong trường hợp này, nó dường như đã gây ra một số nhầm lẫn.
Dưới dạng if..then.else
operator $ cond
thực sự là một ternary
, giống như sẽ được triển khai trong nhiều ngôn ngữ lập trình. Điều này có nghĩa là một điều kiện "nội dòng", thay vì tạo "khối" logic cho các điều kiện, bất kỳ thứ gì không đáp ứng điều kiện đầu tiên đều thuộc về else
.
Do đó, bạn "lồng" các câu lệnh thay vì theo sau các khối:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": {
"if": { "$eq": [ "$field1", "4" ] },
"then": 30,
"else": {
"$cond": {
"if": { "$eq": ["$field1","8"]},
"then": 25,
"else": 10
}
}
}
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Hoặc thậm chí với mảng ban đầu ký hiệu, một số có thể thích hơn nếu xây dựng câu lệnh theo chương trình:
db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);
Đệ tam nghĩa là ba điều kiện, không hơn không kém. Vì vậy, tất cả if..then..else
logic phải được lồng vào nhau.