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 a
và b
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ả a
và b
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ớia
vàb
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:1Loạ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:1Giá 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}