Hacemos una verificación profunda cada uno de los artículos en nuestro espacio con la meta de enseñarte siempre la información certera y certera.
Solución:
Deberá usar el comando findAndModify de MongoDB. Con él, puede seleccionar e incrementar atómicamente un campo.
db.seq.findAndModify(
query: "_id": "users",
update: $inc: "seq":1,
new: true
);
Esto incrementará un contador para el users
colección, que luego puede agregar al documento antes de la inserción. Dado que es atómico, no tiene que preocuparse por las condiciones de carrera que generan ID en conflicto.
No es tan fluido como el de MySQL auto_increment
flag, pero generalmente también tiene la opción de especificar su propia fábrica de ID en su controlador Mongo, por lo que podría implementar una fábrica que use findAndModify para incrementar y devolver ID de forma transparente, lo que resulta en una experiencia mucho más similar a MySQL.
La desventaja de este enfoque es que, dado que cada inserción depende de un bloqueo de escritura en su colección de secuencias, si está haciendo muchas escrituras, podría terminar con un cuello de botella con bastante rapidez. Si solo desea garantizar que los documentos de una colección se clasifiquen en orden de inserción, consulte Colecciones limitadas.
MongoDB está diseñado para ser escalado horizontalmente. En este caso, un incremento automático daría lugar a colisiones de id. Es por eso que la identificación se parece mucho más a un guid/uuid.
MongoDB proporciona 2 formas de incremento automático _identificación(o personalizado key) .
- Colección de contadores de uso
- Bucle optimista
Colección de mostrador
Aquí necesitamos crear una colección que almacene el número máximo de keys e incrementar en 1 cada vez que llamamos a esta función.
1. FUNCIÓN DE ALMACENAMIENTO
function getNextSequence(collectionName)
var ret = db.counters.findAndModify(
query: _id: collectionName ,
update: $inc: seq: 1 ,
new: true,
upsert: true
);
return ret.seq;
2. INSERTAR DOCUMENTO
db.users.insert(
_id: getNextSequence("USER"),
name: "Nishchit."
)
Bucle optimista
En este patrón, un bucle optimista calcula el valor de _id incrementado e intenta insertar un documento con el valor de _id calculado. Si la inserción tiene éxito, el ciclo finaliza. De lo contrario, el ciclo iterará a través de posibles valores de _id hasta que la inserción sea exitosa.
1. FUNCIÓN DE ALMACENAMIENTO
function insertDocument(doc, targetCollection)
while (1)
var cursor = targetCollection.find( , _id: 1 ).sort( _id: -1 ).limit(1);
var seq = cursor.hasNext() ? cursor.next()._id + 1 : 1;
doc._id = seq;
var results = targetCollection.insert(doc);
if( results.hasWriteError() )
if( results.writeError.code == 11000 /* dup key */ )
continue;
else
print( "unexpected error inserting data: " + tojson( results ) );
break;
2. INSERTAR DOCUMENTO
var myCollection = db.USERS;
insertDocument(
name: "Nishchit Dhanani"
,
myCollection
);
documento oficial de Mongo DB.
valoraciones y reseñas
Si te ha sido útil nuestro artículo, agradeceríamos que lo compartas con el resto entusiastas de la programación de esta manera nos ayudas a dar difusión a esta información.