Hi @chewxy
I think we have a misunderstanding here. Apologize for my poor definition in the question.
The upsert only inserts data if the filter condition does not match any record.
So in your case your filter matches some records and you don’t get any inserts.
If there was no message with isread = false in the initial case,
your upsert query would insert data. This is how it works.
The confusion comes in play when we just want to update the data based on some query.
To do so, we can use conditional mutation as a workaround like I posted above.
I believe, it would be better if we have an update syntax exactly like upsert but ensuring no insert at all.