De eneste ting, der "modificerer" dokumentet som svar, er .aggregate()
og .mapReduce()
, hvor førstnævnte er den bedre mulighed.
I så fald beder du om $setDifference
som sammenligner "sættene" og returnerer "forskellen" mellem de to.
Så repræsenterer et dokument med dit array:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Kør aggregeringen:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Hvilket returnerer:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Hvis du ikke ønsker "sæt" og i stedet vil levere et array som [2,3,4,4]
så kan du sammenligne med $filter
og $in
i stedet, hvis du i det mindste har MongoDB 3.4:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Eller med $filter
og $anyElementTrue
i tidligere versioner:
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" ]
}
}
}
}
}
}
}
}}
])
Hvor begge ville vende tilbage:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Hvilket selvfølgelig er "ikke et sæt" siden 4
blev angivet som input "to gange" og returneres derfor også "to gange".