Единствените неща, които "модифицират" документа в отговор са .aggregate()
и .mapReduce()
, където първото е по-добрият вариант.
В този случай вие искате $setDifference
който сравнява "наборите" и връща "разликата" между двете.
Така представяне на документ с вашия масив:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Стартирайте агрегирането:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Което връща:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Ако не искате "набори" и вместо това искате да предоставите масив като [2,3,4,4]
след това можете да сравните с $filter
и $in
вместо това, ако имате поне MongoDB 3.4:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Или с $filter
и $anyElementTrue
в по-ранни версии:
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" ]
}
}
}
}
}
}
}
}}
])
Където и двамата биха се върнали:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Което разбира се "не е набор" от 4
е предоставен като вход "два пъти" и следователно се връща и "два пъти".