Les seules choses qui "modifient" le document en réponse sont .aggregate()
et .mapReduce()
, où le premier est la meilleure option.
Dans ce cas, vous demandez $setDifference
qui compare les "ensembles" et renvoie la "différence" entre les deux.
Donc représenter un document avec votre tableau :
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Exécutez l'agrégation :
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Qui renvoie :
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Si vous ne voulez pas d'"ensembles" et souhaitez plutôt fournir un tableau comme [2,3,4,4]
alors vous pouvez comparer avec $filter
et $in
à la place, si vous avez au moins MongoDB 3.4 :
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Ou avec $filter
et $anyElementTrue
dans les versions antérieures :
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" ]
}
}
}
}
}
}
}
}}
])
Où les deux reviendraient :
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Ce qui n'est bien sûr "pas un ensemble" puisque le 4
a été fourni comme entrée "deux fois" et est donc renvoyé "deux fois" également.