De enige dingen die het document als reactie "aanpassen" zijn .aggregate()
en .mapReduce()
, waarbij de eerste de betere optie is.
In dat geval vraagt u om $setDifference
die de "sets" vergelijkt en het "verschil" tussen de twee retourneert.
Dus een document vertegenwoordigen met je array:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Voer de aggregatie uit:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Wat terugkomt:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Als u geen "sets" wilt en in plaats daarvan een array wilt leveren zoals [2,3,4,4]
dan kun je vergelijken met $filter
en $in
in plaats daarvan, als je tenminste MongoDB 3.4 hebt:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Of met $filter
en $anyElementTrue
in eerdere versies:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": {
"$anyElementTrue": {
"$map": {
"input": "$b",
"as": "b",
"in": {
"$eq": [ "$$a", "$$b" ]
}
}
}
}
}
}
}
}}
])
Waar beide zouden terugkeren:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Wat natuurlijk "geen set" is sinds de 4
is opgegeven als invoer "tweemaal" en wordt daarom ook "tweemaal" geretourneerd.