Satu-satunya hal yang "memodifikasi" dokumen sebagai tanggapan adalah .aggregate()
dan .mapReduce()
, di mana yang pertama adalah pilihan yang lebih baik.
Dalam hal ini Anda meminta $setDifference
yang membandingkan "set" dan mengembalikan "perbedaan" antara keduanya.
Jadi mewakili dokumen dengan array Anda:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Jalankan agregasi:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Yang mengembalikan:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Jika Anda tidak ingin "set" dan sebaliknya ingin menyediakan array seperti [2,3,4,4]
kemudian Anda dapat membandingkan dengan $filter
dan $in
sebagai gantinya, jika Anda memiliki MongoDB 3.4 setidaknya:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Atau dengan $filter
dan $anyElementTrue
di versi sebelumnya:
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" ]
}
}
}
}
}
}
}
}}
])
Di mana keduanya akan kembali:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Yang tentu saja "bukan satu set" sejak 4
diberikan sebagai masukan "dua kali" dan oleh karena itu dikembalikan "dua kali" juga.