A partir de MongoDB 2.4, ya no es necesario confiar en un índice único (o cualquier otra solución) para findOrCreate
atómico como operaciones.
Esto es gracias a $setOnInsert
operador nuevo en 2.4, que le permite especificar actualizaciones que solo deberían ocurrir al insertar documentos.
Esto, combinado con el upsert
opción, significa que puede usar findAndModify
para lograr un findOrCreate
atómico -como operación.
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
solo afecta a los documentos que se insertan, si se encuentra un documento existente, no se producirá ninguna modificación. Si no existe ningún documento, insertará uno con el _id especificado y luego realizará el conjunto de inserción solamente. En ambos casos se devuelve el documento.