Jediné věci, které „upravují“ dokument v odpovědi, jsou .aggregate()
a .mapReduce()
, kde první možnost je lepší.
V tom případě žádáte o $setDifference
který porovná "množiny" a vrátí "rozdíl" mezi nimi.
Takže reprezentující dokument s vaším polem:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Spusťte agregaci:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Což vrátí:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Pokud nechcete "sady" a místo toho chcete dodat pole jako [2,3,4,4]
pak můžete porovnat s $filter
a $in
místo toho, pokud máte MongoDB 3.4 alespoň:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Nebo pomocí $filter
a $anyElementTrue
v dřívějších verzích:
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" ]
}
}
}
}
}
}
}
}}
])
Kam by se oba vrátili:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Což od 4
samozřejmě "není sada". byl poskytnut jako vstup "dvakrát" a je proto také vrácen "dvakrát".