Database

[{"a":"a1","b":"b1","c":"c1","d":"d1"},{"a":"a2","b":"b2","c":"c2","d":"d2"}]

Query

db.collection.aggregate([{$match:{"a":"a1","b":"b1"}},/** compute the unconditional update/merge result first*/{$set:{merged:{"$mergeObjects":["$$ROOT",{"c":"c3","d":"d3","e":"e3"}]}}},{$set:{merged:{"$objectToArray":"$merged"},rootArray:{"$objectToArray":"$$ROOT"}}},{$set:{merged:{/** filter the merge/update result if the key exists in original document*/"$filter":{"input":"$merged","as":"m","cond":{"$in":["$$m.k","$rootArray.k"]}}}}},{"$replaceRoot":{"newRoot":{"$arrayToObject":"$merged"}}},{"$merge":{"into":"collection","on":"_id"}}])

Result