応答としてドキュメントを「変更」するのは、.aggregate()
だけです。 および.mapReduce()
、前者がより良いオプションです。
その場合、あなたは$setDifference
を求めています これは「セット」を比較し、2つの間の「違い」を返します。
したがって、配列でドキュメントを表す:
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
以降、これはもちろん「セットではありません」 入力として「2回」提供されたため、「2回」も返されます。