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

MongoDB $ setIsSubset

Trong MongoDB, $setIsSubset toán tử đường ống tổng hợp chấp nhận hai mảng và trả về true khi mảng đầu tiên là tập con của mảng thứ hai và false khi nào thì không.

Mảng đầu tiên cũng được coi là một tập hợp con khi nó bằng với mảng thứ hai.

$setIsSubset chấp nhận hai đối số, cả hai đề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. $setIsSubset 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 $setIsSubset 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: { $setIsSubset: [ "$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":true} {"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

$setIsSubset 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 $setIsSubset cho hai tài liệu đó:

 db.data.aggregate(
   [
     { $match: { _id: { $in: [ 6, 7 ] } } },
     {
       $project:
          {
            _id: 0,
            a: 1,
            b: 1,
            result: { $setIsSubset: [ "$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, người ta thấy rằng a không phải là một tập hợp con của b .

Tuy nhiên, 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]} 

Tài liệu 8 chứa một mảng lồng nhau ở cả ab và cả hai mảng đều giống hệt nhau.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $setIsSubset đố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: { $setIsSubset: [ "$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, a không phải là một tập hợp con của b và do đó kết quả là false .

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

Áp dụng $setIsSubset đế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 $setIsSubset tới ab lĩnh vực:

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

Kết quả:

 Lỗi:lệnh không thành công:{"ok":0, "errmsg":"cả hai toán hạng của $ setIsSubset phải là mảng. Đối số thứ hai thuộc loại:thiếu", "mã":17042, "codeName":"Location17042 "}: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 

Loại dữ liệu sai

Cả hai toán hạng của $setIsSubset phải là mảng. Nếu không, một lỗi sẽ xảy ra.

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 $setIsSubset đố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: { $setIsSubset: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

 Lỗi:lệnh không thành công:{"ok":0, "errmsg":"cả hai toán hạng của $ setIsSubset phải là mảng. Đối số thứ hai thuộc loại:double", "code":17042, "codeName":"Location17042 "}: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

$setIsSubset toán tử bỏ qua các bản sao. 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 $setIsSubset 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: { $setIsSubset: [ "$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} 

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB và CodeIgniter

  2. Cập nhật nhiều tài liệu theo bộ id. Mongoose

  3. Trả về số lượng bản ghi có hạn của một loại nhất định, nhưng không giới hạn số lượng bản ghi khác?

  4. Cập nhật một phần tài liệu con với nodejs / mongoose

  5. Thông báo lỗi:MongoError:Xác thực bad auth không thành công thông qua chuỗi URI