Die einzigen Dinge, die das Dokument als Antwort "modifizieren", sind .aggregate()
und .mapReduce()
, wobei Ersteres die bessere Option ist.
In diesem Fall fragen Sie nach $setDifference
die die "Sätze" vergleicht und die "Differenz" zwischen den beiden zurückgibt.
So stellen Sie ein Dokument mit Ihrem Array dar:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Führen Sie die Aggregation aus:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Was zurückgibt:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Wenn Sie keine "Sets" möchten und stattdessen ein Array wie [2,3,4,4]
bereitstellen möchten dann kannst du mit $filter
vergleichen und $in
stattdessen, wenn Sie mindestens MongoDB 3.4 haben:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Oder mit $filter
und $anyElementTrue
in früheren Versionen:
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" ]
}
}
}
}
}
}
}
}}
])
Wohin beide zurückkehren würden:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Was natürlich seit der 4
"kein Satz" ist wurde als Input "zweimal" bereitgestellt und wird daher auch "zweimal" zurückgegeben.