You can find a document, update and return it using a single method: findAndModify
. This is useful to deal with concurrency issues when multiple clients are trying to process documents from a collection and you don't want two of them processing the same one.
For example:
db.operations.findAndModify({
query: { taken: { "$exists": false } },
update: { taken: true }
})
query: { taken: { "$exists": false } },
update: { taken: true }
})
This will safely return a single document that hasn't been taken by another process while marking it as taken.
By default, this method returns the document before the update, but you can add new: true
to get the new one.