Saltar al contenido

¿Cómo se implementa una ID principal de incremento automático en MongoDB?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *