Från och med MongoDB 3.2 kan vi använda $filter
operatören att effektivt göra detta. I $filter
s villkorliga uttryck måste vi använda $setIsSubset
operatorn för att kontrollera om ett givet värde finns i arrayen. Det beror främst på att vi inte kan använda $in
frågeoperator i $project
skede.
db.collection.aggregate([
{ "$project": {
"list": {
"$filter": {
"input": "$list",
"as": "lst",
"cond": { "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] }
}
}
}}
])
Från MongoDB 3.0.x och bakåt behöver du ett annat, mindre effektivt tillvägagångssätt med $map
operatorn och $setDifference
operatör.
db.collection.aggregate([
{ "$project": {
"list": {
"$setDifference": [
{ "$map": {
"input": "$list",
"as": "lst",
"in": {
"$cond": [
{ "$setIsSubset": [ [ "$$lst.a" ], [ 1, 5 ] ] },
"$$lst",
false
]
}
}},
[false]
]
}
}}
])