Le uniche cose che "modificano" il documento in risposta sono .aggregate()
e .mapReduce()
, dove la prima è l'opzione migliore.
In tal caso stai chiedendo $setDifference
che confronta gli "insiemi" e restituisce la "differenza" tra i due.
Quindi rappresentare un documento con il tuo array:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Esegui l'aggregazione:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Che restituisce:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Se non vuoi "set" e vuoi invece fornire un array come [2,3,4,4]
quindi puoi confrontare con $filter
e $in
invece, se hai almeno MongoDB 3.4:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Oppure con $filter
e $anyElementTrue
nelle versioni precedenti:
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" ]
}
}
}
}
}
}
}
}}
])
Dove sarebbero tornati entrambi:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Che ovviamente "non è un set" dal momento che il 4
è stato fornito come input "due volte" e viene quindi restituito anche "due volte".