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

MongoDB $ setEquals

Trong MongoDB, $setEquals toán tử đường ống tổng hợp so sánh hai hoặc nhiều mảng và trả về true nếu chúng có các phần tử riêng biệt giống nhau và false nếu không.

$setEquals chấp nhận hai hoặc nhiều đối số, tất cả đều có thể là bất kỳ biểu thức hợp lệ nào miễn là mỗi đối số phân giải thành một mảng. $setEquals coi các mảng là tập hợp.

Ví dụ

Giả sử chúng ta có một tập hợp được gọi là data với các tài liệu sau:

 {"_id":1, "a":[1, 2, 3], "b":[1, 2, 3]} {"_id":2, "a":[1, 2, 3], "b":[1, 2]} {"_id":3, "a":[1, 2], "b":[1, 2, 3]} {"_id":4, " a ":[1, 2, 3]," b ":[3, 4, 5]} {" _id ":5," a ":[1, 2, 3]," b ":[4, 5 , 6]} 

Chúng tôi có thể áp dụng $setEquals toán tử so với ab các trường trong các tài liệu đó.

Ví dụ:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 {"a":[1, 2, 3], "b":[1, 2, 3], "result":true} {"a":[1, 2, 3], "b" :[1, 2], "result":false} {"a":[1, 2], "b":[1, 2, 3], "result":false} {"a":[1, 2, 3], "b":[3, 4, 5], "result":false} {"a":[1, 2, 3], "b":[4, 5, 6], "result ":false} 

Mảng lồng nhau

$setEquals toán tử không đi xuống bất kỳ mảng lồng nhau nào. Nó chỉ đánh giá các mảng cấp cao nhất.

Giả sử bộ sưu tập của chúng tôi cũng chứa các tài liệu sau:

 {"_id":6, "a":[1, 2, 3], "b":[[1, 2, 3]]} {"_id":7, "a":[1, 2, 3], "b":[[1, 2], 3]} 

Và chúng tôi áp dụng $setEquals cho hai tài liệu đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 {"a":[1, 2, 3], "b":[[1, 2, 3]], "result":false} {"a":[1, 2, 3], " b ":[[1, 2], 3]," kết quả ":false} 

Trong tài liệu đầu tiên, b trường chứa một mảng chỉ chứa một phần tử - một mảng khác. Trong trường hợp này, Mảng bên ngoài đã được đánh giá và nó được phát hiện là không chứa các giá trị giống như trong mảng tại a .

Tuy nhiên, nếu a trường đã chứa một mảng lồng nhau, nó có thể là một câu chuyện khác.

Giả sử chúng ta có các tài liệu sau:

 {"_id":8, "a":[[1, 2, 3]], "b":[[1, 2, 3]]} {"_id":9, "a":[ [1, 2, 3]], "b":[[1, 2], 3]} 

Và chúng tôi áp dụng $setEquals đối với các tài liệu đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 8, 9 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 {"a":[[1, 2, 3]], "b":[[1, 2, 3]], "result":true} {"a":[[1, 2, 3 ]], "b":[[1, 2], 3], "kết quả":false} 

Trong tài liệu đầu tiên, a khớp với b chính xác, và kết quả là true .

Trong tài liệu thứ hai, mảng lồng nhau tại a khác với mảng lồng nhau tại b và do đó chúng tôi nhận được false .

Các trường bị thiếu

Áp dụng $setEquals đến một trường không tồn tại dẫn đến lỗi.

Xem xét các tài liệu sau:

 {"_id":10, "a":[1, 2, 3]} {"_id":11, "b":[1, 2, 3]} {"_id":12}  

Tài liệu đầu tiên không có b trường, tài liệu thứ hai không có a và tài liệu thứ ba cũng không có.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $setEquals tới ab lĩnh vực:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 10, 11, 12 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 Lỗi:lệnh không thành công:{"ok":0, "errmsg":"Tất cả các toán hạng của $ setEquals phải là mảng. Một đối số thuộc loại:thiếu", "mã":17044, "codeName":"Location17044 "}:tổng hợp không thành công:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @ (shell):1:1 

Như thông báo nêu rõ, tất cả các toán hạng phải là mảng. Đối số / trường bị thiếu không phải là một mảng.

Loại dữ liệu sai

Như đã thấy trong ví dụ trước, tất cả các toán hạng của $setEquals phải là mảng. Nếu trường mà họ tham chiếu bị thiếu, một lỗi sẽ xảy ra. Lỗi tương tự cũng xảy ra khi toán hạng không bị thiếu, nhưng chỉ là sai loại.

Giả sử bộ sưu tập của chúng tôi chứa các tài liệu sau:

 {"_id":13, "a":[1, 2, 3], "b":3} {"_id":14, "a":3, "b":[1, 2, 3]} {"_id":15, "a":2, "b":3} 

Và chúng tôi áp dụng $setEquals đối với các tài liệu đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 13, 14, 15 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 Lỗi:lệnh không thành công:{"ok":0, "errmsg":"Tất cả các toán hạng của $ setEquals phải là mảng. Một đối số thuộc loại:double", "code":17044, "codeName":"Location17044 "}:tổng hợp không thành công:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert. js:639:[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @ (shell):1:1 

Giá trị trùng lặp

$setEquals toán tử bỏ qua các mục trùng lặp. Nó cũng bỏ qua thứ tự của các phần tử.

Giả sử chúng ta có các tài liệu sau:

 {"_id":16, "a":[1, 1, 2, 2, 3, 3], "b":[1, 2, 3]} {"_id":17, "a" :[1, 1, 2, 2, 3, 3], "b":[1, 2]} {"_id":18, "a":[1, 1, 2, 2, 3, 3], "b":[]} {"_id":19, "a":[3, 2, 1, 2, 3, 1], "b":[2, 3, 1]} {"_id":20 , "a":[1, 3, 2, 2, 3, 1], "b":[2, 1]} {"_id":21, "a":[2, 3, 1, 2, 3 , 1], "b":[]} 

Sau đó, chúng tôi áp dụng $setEquals toán tử cho họ:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 16, 17, 18, 19, 20, 21 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setEquals: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 {"a":[1, 1, 2, 2, 3, 3], "b":[1, 2, 3], "result":true} {"a":[1, 1, 2, 2, 3, 3], "b":[1, 2], "result":false} {"a":[1, 1, 2, 2, 3, 3], "b":[] , "result":false} {"a":[3, 2, 1, 2, 3, 1], "b":[2, 3, 1], "result":true} {"a":[ 1, 3, 2, 2, 3, 1], "b":[2, 1], "result":false} {"a":[2, 3, 1, 2, 3, 1], "b ":[]," kết quả ":false} 

Nhiều hơn hai đối số

Như đã đề cập, $setEquals chấp nhận hai hoặc nhiều đối số. Trong mọi trường hợp, các đối số phải có cùng giá trị riêng biệt để trả về true . Nếu không, kết quả sẽ là false .

Giả sử chúng ta có các tài liệu sau:

 {"_id":22, "a":[1, 2], "b":[1, 2], "c":[1, 2]} {"_id":23, "a" :[1, 2], "b":[1, 2], "c":[1, 2, 3]} 

Các tài liệu này có thêm một trường - a c trường.

Bây giờ hãy áp dụng $setEquals cho ba trường đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 22, 23 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            c: 1,
            result: { $setEquals: [ "$a", "$b", "$c" ] }
          }
     }
   ]
) 

Kết quả:

 {"a":[1, 2], "b":[1, 2], "c":[1, 2], "result":true} {"a":[1, 2] , "b":[1, 2], "c":[1, 2, 3], "result":false} 

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để kết nối mongodb với node.js (và xác thực)?

  2. Tại sao hướng của chỉ mục lại quan trọng trong MongoDB?

  3. Ngủ đông với MongoDB

  4. Làm thế nào để xóa nhiều bộ sưu tập mongodb cùng một lúc?

  5. Lỗi:queryTxt ETIMEOUT khi kết nối với MongoDb Atlas bằng mongoose