Ehi, l'unico modo in cui penso ora è aggiungere un parametro di stato e utilizzare l'operazione findAndModify(), che ti consente di modificare atomicamente un documento. È un po' più lento, ma dovrebbe funzionare.
Diciamo quindi che aggiungi un attributo di stato e quando recuperi il documento modifichi lo stato da "IDLE" a "ELABORAZIONE". Quindi aggiorni il documento e lo salvi di nuovo nella raccolta aggiornando nuovamente lo stato su "IDLE".
Esempio di codice:
var doc = db.runCommand({
"findAndModify" : "COLLECTION_NAME",
"query" : {"_id": "ID_DOCUMENT", "status" : "IDLE"},
"update" : {"$set" : {"status" : "RUNNING"} }
}).value
Modifica COLLECTION_NAME e ID_DOCUMENT in un valore corretto. Per impostazione predefinita, findAndModify() restituisce il vecchio valore, il che significa che il valore dello stato sarà ancora IDLE sul lato client. Quindi, quando hai finito con l'aggiornamento, salva/aggiorna di nuovo tutto.
L'unico pensiero che devi essere consapevole è che puoi modificare solo un documento alla volta.
Spero che aiuti.