MongoDB - Secuencia de incremento automático

MongoDB no tiene una funcionalidad de incremento automático lista para usar, como las bases de datos SQL. De forma predeterminada, utiliza el ObjectId de 12 bytes para_idcampo como la clave principal para identificar de forma exclusiva los documentos. Sin embargo, puede haber escenarios en los que queramos que el campo _id tenga algún valor autoincrementado que no sea ObjectId.

Dado que esta no es una característica predeterminada en MongoDB, lograremos esta funcionalidad mediante programación utilizando un counters colección como lo sugiere la documentación de MongoDB.

Uso de Counter Collection

Considera lo siguiente productsdocumento. Queremos que el campo _id sea unauto-incremented integer sequence desde 1,2,3,4 hasta n.

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

Para ello, cree un counters colección, que realizará un seguimiento del último valor de secuencia para todos los campos de secuencia.

>db.createCollection("counters")

Ahora, insertaremos el siguiente documento en la colección de contadores con productid como su clave -

> db.counters.insert({
	"_id":"productid",
	"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>

El campo sequence_value realiza un seguimiento del último valor de la secuencia.

Utilice el siguiente código para insertar este documento de secuencia en la colección de contadores:

>db.counters.insert({_id:"productid",sequence_value:0})

Creación de la función de JavaScript

Ahora crearemos una función getNextSequenceValueque tomará el nombre de la secuencia como entrada, incrementará el número de secuencia en 1 y devolverá el número de secuencia actualizado. En nuestro caso, el nombre de la secuencia esproductid.

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

Usando la función de Javascript

Ahora usaremos la función getNextSequenceValue mientras creamos un nuevo documento y asignamos el valor de secuencia devuelto como el campo _id del documento.

Inserte dos documentos de muestra con el siguiente código:

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

Como puede ver, hemos utilizado la función getNextSequenceValue para establecer el valor del campo _id.

Para verificar la funcionalidad, busquemos los documentos usando el comando buscar -

>db.products.find()

La consulta anterior devolvió los siguientes documentos con el campo _id incrementado automáticamente:

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }