MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Công tắc MongoDB $

Trong MongoDB, $switch toán tử đường ống tổng hợp đánh giá một loạt các case và chỉ thực thi một biểu thức được chỉ định khi case biểu thức đánh giá thành true .

Cú pháp

Cú pháp như sau:

$switch: {
   branches: [
      { case: <expression>, then: <expression> },
      { case: <expression>, then: <expression> },
      ...
   ],
   default: <expression>
}

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }

Chúng ta có thể sử dụng $switch toán tử để chạy một số biểu thức chữ hoa chữ thường đối với weight lĩnh vực:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lt: [ "$weight", 20 ]  }, then: "Light" }
              ],
              default: "Medium"
            }
          }
        }
    }
  ]
)

Kết quả:

{ "weight" : 20, "result" : "Medium" }
{ "weight" : 10, "result" : "Light" }
{ "weight" : 7, "result" : "Light" }
{ "weight" : 8, "result" : "Light" }
{ "weight" : 100, "result" : "Medium" }
{ "weight" : 130, "result" : "Heavy" }
{ "weight" : 200, "result" : "Heavy" }
{ "weight" : 12, "result" : "Light" }
{ "weight" : 30, "result" : "Medium" }

Bỏ qua Biểu thức Mặc định

Bỏ qua default từ mã có thể dẫn đến lỗi. Nhưng điều này phụ thuộc vào kết quả của case biểu thức.

Nếu chúng tôi xóa default từ ví dụ trên, chúng tôi gặp lỗi:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lt: [ "$weight", 20 ]  }, then: "Light" }
              ]
            }
          }
        }
    }
  ]
)

Kết quả:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$switch could not find a matching branch for an input, and no default was specified.",
	"code" : 40066,
	"codeName" : "Location40066"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Trong trường hợp này, có các giá trị đầu vào không nằm trong case biểu thức (tức là từ 20 đến 100) và $switch đã trả lại một lỗi.

Tuy nhiên, nếu chúng tôi thay đổi case một chút, chúng ta có thể xóa default phần không có lỗi:

db.pets.aggregate(
  [
    {
      $project:
        { 
          _id: 0,
          weight: 1,
          result: {
            $switch: {
              branches: [
                  { case: { $gt: [ "$weight", 100 ]  }, then: "Heavy" },
                  { case: { $lte: [ "$weight", 100 ]  }, then: "Light" }
              ]
            }
          }
        }
    }
  ]
)

Kết quả:

{ "weight" : 20, "result" : "Light" }
{ "weight" : 10, "result" : "Light" }
{ "weight" : 7, "result" : "Light" }
{ "weight" : 8, "result" : "Light" }
{ "weight" : 100, "result" : "Light" }
{ "weight" : 130, "result" : "Heavy" }
{ "weight" : 200, "result" : "Heavy" }
{ "weight" : 12, "result" : "Light" }
{ "weight" : 30, "result" : "Light" }

Trong ví dụ này, tất cả các tài liệu đều thỏa mãn tất cả case biểu thức và vì vậy default không cần thiết - có nghĩa là không có lỗi nào được tạo ra.

Tài liệu MongoDB

Xem tài liệu MongoDB để biết thêm chi tiết và các ví dụ.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sắp xếp kết quả tổng hợp addToSet

  2. Tạo chỉ mục đa trường trong Mongoose / MongoDB

  3. $ bỏ qua và $ giới hạn trong khuôn khổ tổng hợp

  4. Truy vấn MongoDB để khớp trong mục đầu tiên trong một mảng

  5. Mongoose:Lược đồ vs Mô hình?