I want to insert a document into a MongoDB in an idempotent way.
The explanation provided by the MongoDB documentation, and also here on SO, is to use the upsert=True
modifier.
However, to my understanding, this does not guarantee idempotence, because an already existing document could be modified.
The operation I am looking for is as follows:
Does MongoDB support such an operation out of the box? Why are upsert operations labelled idempotent even though they might modify the document that is already present?
Idempotent means that you can execute the same action twice and have the same effect as if it only had happened once. The name upsert
is also a hint: it is a contraction of update
and insert
. This means that it will either (if it exists) update an existing document, or insert a new one. So: upsert operations are labelled idempotent because they are. Your interpretation of the word idempotent is not what everyone else uses.
Your use case resp. requirement is something else. In my understanding, it is quite hard to do that in MongoDB, because there are no usable general inbuilt transaction mechanisms (at least last I looked). You'd need to do something like a two-phase commit, from your application.