Những thứ duy nhất "sửa đổi" tài liệu trong phản hồi là .aggregate()
và .mapReduce()
, trong đó cái trước là lựa chọn tốt hơn.
Trong trường hợp đó, bạn đang yêu cầu $setDifference
so sánh "bộ" và trả về "sự khác biệt" giữa hai bộ.
Vì vậy, đại diện cho một tài liệu với mảng của bạn:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
Chạy tổng hợp:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
Trả về:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
Nếu bạn không muốn "tập hợp" và thay vào đó muốn cung cấp một mảng như [2,3,4,4]
thì bạn có thể so sánh với $filter
và $in
thay vào đó, nếu bạn có MongoDB 3.4 ít nhất:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
Hoặc với $filter
và $anyElementTrue
trong các phiên bản trước:
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" ]
}
}
}
}
}
}
}
}}
])
Nơi cả hai sẽ trở về:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
Tất nhiên là "không phải là một tập hợp" vì 4
đã được cung cấp dưới dạng đầu vào "hai lần" và do đó cũng được trả về "hai lần".