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

Có điều gì khác nếu trong MongoDB thành $ cond trong khi tổng hợp không

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể kết nối với MongoDB trong Azure

  2. Mongodb cập nhật tất cả các tài liệu với id duy nhất

  3. MongoDB Regular Expression:Chứa e-mail bên trong một chuỗi

  4. Nguồn đồng bộ không có lỗi phiên bản tương thích tính năng khi thêm thành viên MongoDB 3.6 vào bộ bản sao 3,4

  5. Sắp xếp truy vấn Spring MongoDB