Bắt đầu từ MongoDB 3.2, chúng ta có thể sử dụng bộ lọc $
điều hành hiệu quả cho điều này. Trong $ filter
Biểu thức điều kiện của chúng ta cần sử dụng $ setIsSubset
toán tử để kiểm tra xem một giá trị đã cho có trong mảng hay không. Điều này chủ yếu là do chúng tôi không thể sử dụng $ in
toán tử truy vấn trong $ project
sân khấu.
db.collection.aggregate([
{ "$project": {
"list": {
"$filter": {
"input": "$list",
"as": "lst",
"cond": { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] }
}
}
}}
])
Từ MongoDB 3.0.x trở về trước, bạn cần một cách tiếp cận khác, kém hiệu quả hơn bằng cách sử dụng $ map
toán tử và $ setDifference
nhà điều hành.
db.collection.aggregate([
{ "$project": {
"list": {
"$setDifference": [
{ "$map": {
"input": "$list",
"as": "lst",
"in": {
"$cond": [
{ "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] },
"$$lst",
false
]
}
}},
[false]
]
}
}}
])