A partir do MongoDB 2.4, não é mais necessário contar com um índice exclusivo (ou qualquer outra solução alternativa) para
findOrCreate
atômico como operações. Isso é graças ao
$setOnInsert
operador novo para 2.4, que permite especificar atualizações que devem ocorrer apenas na inserção de documentos. Isso, combinado com o
upsert
opção, significa que você pode usar findAndModify
para alcançar um findOrCreate
atômico -como operação. db.collection.findAndModify({
query: { _id: "some potentially existing id" },
update: {
$setOnInsert: { foo: "bar" }
},
new: true, // return new doc if one is upserted
upsert: true // insert the document if it does not exist
})
Como
$setOnInsert
afeta apenas os documentos que estão sendo inseridos, se um documento existente for encontrado, nenhuma modificação ocorrerá. Se não existir nenhum documento, ele fará o upsert de um com o _id especificado e, em seguida, executará apenas a inserção definida. Em ambos os casos, o documento é devolvido.