Las únicas cosas que "modifican" el documento en respuesta son .aggregate()
y .mapReduce()
, donde la primera es la mejor opción.
En ese caso, está solicitando $setDifference
que compara los "conjuntos" y devuelve la "diferencia" entre los dos.
Entonces, representando un documento con su matriz:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Ejecute la agregación:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Que devuelve:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Si no desea "conjuntos" y, en cambio, desea proporcionar una matriz como [2,3,4,4]
entonces puedes comparar con $filter
y $in
en cambio, si tiene MongoDB 3.4 al menos:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
O con $filter
y $anyElementTrue
en versiones anteriores:
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" ]
}
}
}
}
}
}
}
}}
])
Donde ambos regresarían:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Lo cual, por supuesto, "no es un conjunto" ya que el 4
se proporcionó como entrada "dos veces" y, por lo tanto, también se devuelve "dos veces".