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

MongoDB $ setIntersection

Trong MongoDB, $setIntersection toán tử đường ống tổng hợp chấp nhận hai hoặc nhiều mảng và trả về một mảng có chứa các phần tử xuất hiện trong tất cả các mảng đầu vào.

$setIntersection 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. $setIntersection 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 ta có thể áp dụng $setIntersection 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: { $setIntersection: [ "$a", "$b" ] }
          }
     }
   ]
) 

Kết quả:

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

Mảng lồng nhau

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

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

Kết quả:

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

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 tìm thấy là không chứa bất kỳ giá trị nào trong mảng tại a .

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

Kết quả:

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

Trong tài liệu đầu tiên, a khớp với b chính xác, và do đó kết quả là một mảng giống hệt nhau (mảng bên ngoài chứa mảng bên trong).

Trong tài liệu thứ hai, nội dung của a không khớp với bất kỳ nội dung nào của b và do đó, một mảng trống được trả về.

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

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

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 $setIntersection tới ab lĩnh vực:

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

Kết quả:

 {"a":[1, 2, 3], "result":null} {"b":[1, 2, 3], "result":null} {"result":null}  

Loại dữ liệu sai

Tất cả các toán hạng của $setIntersection 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 $setIntersection đố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: { $setIntersection: [ "$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 $ setIntersection phải là mảng. Một đối số thuộc loại:double", "code":17047, "codeName":"Location17047 "}: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

$setIntersection toán tử lọc ra các bản sao trong kết quả của nó để xuất ra một mảng chỉ chứa các mục nhập duy nhất. Ngoài ra, thứ tự của các phần tử trong mảng đầu ra là không xác định.

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

Kết quả:

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

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

Như đã đề cập, $setIntersection chấp nhận hai hoặc nhiều đối số. Tất cả các ví dụ trước đều sử dụng hai đối số. Đây là một trong những sử dụng ba đối số.

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 $setIntersection cho ba trường đó:

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

Kết quả:

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Năm mẹo để lưu trữ MongoDB tốt hơn trên Azure

  2. Phần mềm trung gian lưu trữ phiên tốt nhất cho Express + MongoDB

  3. Mongo không thể bắt đầu

  4. Sáu thành phần quan trọng của quản trị dữ liệu thành công

  5. mongodb.conf bind_ip =127.0.0.1 không hoạt động nhưng 0.0.0.0 hoạt động