Jedyne rzeczy, które „modyfikują” dokument w odpowiedzi to .aggregate()
i .mapReduce()
, gdzie ta pierwsza opcja jest lepszą opcją.
W takim przypadku prosisz o $setDifference
który porównuje „zestawy” i zwraca „różnicę” między nimi.
Reprezentowanie dokumentu za pomocą tablicy:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Uruchom agregację:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Który powraca:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Jeśli nie chcesz „zestawów”, a zamiast tego chcesz dostarczyć tablicę, taką jak [2,3,4,4]
następnie możesz porównać z $filter
i $in
zamiast tego, jeśli masz MongoDB 3.4 przynajmniej:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Lub za pomocą $filter
i $anyElementTrue
we wcześniejszych wersjach:
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" ]
}
}
}
}
}
}
}
}}
])
Gdzie obaj wrócą:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Co oczywiście nie jest „zestawem”, ponieważ 4
został podany jako wejście "dwa razy" i dlatego jest również zwracany "dwa razy".