Database
[{_id:1,message:"text1"},{_id:2,message:"text2",reactions:[{_id:323123,user:"bob",reaction:"good"},{_id:654635465448,user:"bob",reaction:"bad"},{_id:56465498798798,user:"susan",reaction:"confused"},{_id:1210231878931,user:"susan",reaction:"good"}]},]
Query
/** Successfully removes good reaction*db.collection.update({* _id: 2*},*{* $pull: {* "reactions": {* "user": "bob",* "reaction": "good"* }* }*})*/db.collection.update({_id:2},[{$set:{reactions:{$cond:[{$gte:[{$size:{$filter:{input:"$reactions",as:"reactions",cond:{$and:[{$eq:["$$reactions.user","bobby"]},{$eq:["$$reactions.reaction","goody"]}]}}}},1]},{$setDifference:["$reactions",{/**$in: [ {user: "bob",reaction: "good" }, "$reactions" ]*/$filter:{input:"$reactions",as:"reactions",cond:{$and:[{$eq:["$$reactions.user","bob"]},{$eq:["$$reactions.reaction","good"]}]}}}]},{/** Sadly we can't just $addToSet :( :( :(*$addToSet: { user: "bobby", reaction: "goody"}* Probably won't generate an _id, so it will be malformed compared to the others.*/$concatArrays:["$reactions",[{user:"bobby",reaction:"goody"}]]}]}}}])