A partir do MongoDB 2.4, não é mais necessário contar com um índice exclusivo (ou qualquer outra solução alternativa) para findOrCreateoperações do tipo atômico .
Isso é graças ao o $setOnInsertoperador de novo para 2.4, o que permite que você especifique as atualizações que só deve acontecer quando inserir documentos.
Isso, combinado com a upsertopção, significa que você pode usar findAndModifypara obter uma findOrCreateoperação semelhante a atômica .
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 $setOnInsertafeta apenas os documentos inseridos, se um documento existente for encontrado, nenhuma modificação ocorrerá. Se não houver nenhum documento, ele fará um upsert com o _id especificado e, em seguida, realizará o conjunto de inserção apenas. Em ambos os casos, o documento é devolvido.
collection.findAndModify({_id:'theId'}, <your sort opts>, {$setOnInsert:{foo: 'bar'}}, {new:true, upsert:true}, callback). Veja os documentos