English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Secuencias de autoincremento en MongoDB

MongoDB no tiene una función de增量 automático envasado como las bases de datos SQL. Por defecto, se_iddel campo12El ObjectId de byte se utiliza como clave principal para identificar de manera única el documento. Sin embargo, en ciertos casos, podríamos desear que el campo _id tenga un valor automático y incremental además del ObjectId.

由于这不是MongoDB中的默认功能,因此我们将通过使用countersDado que esto no es una función predeterminada en MongoDB, lo haremos a través de

Implementar esta función de manera programática con las recomendaciones de la colección de documentos MongoDB.

Utilice la colección de contadoresVea a continuaciónproducts1,2,3,4a una secuencia de enteros autoincrementales desde

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

Para esto, creamos uncountersLa colección, que rastreará los últimos valores de todos los campos de secuencia.

>db.createCollection("counters")

Ahora, insertaremos el siguiente documentoproductidinsertar en la colección counters como su clave-

>
	"_id":"productid",
	"sequence_value": 0
}
WriteResult({ "nInserted" : 1 }
>

El campo sequence_value rastrea el último valor de la secuencia.

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

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

Crear una función de Javascript

Ahora, crearemos una funcióngetNextSequenceValue, esta función toma el nombre de la secuencia como entrada, suma1y devolver el número de secuencia actualizado. En nuestro ejemplo, 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;
}

Utilice la función de Javascript

Ahora, utilizaremos la función getNextSequenceValue cuando creamos un nuevo documento y asignemos el valor de secuencia devuelto al campo _id del documento.

Utilice el siguiente código para insertar dos documentos de ejemplo-

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

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

Para verificar la funcionalidad, utilicemos la orden find para obtener documentos-

>db.products.find()

La consulta superior devolvió los siguientes documentos con el campo _id de autoincremento-

{ "_id": 1, "product_name": "Apple iPhone", "category": "mobiles"
{ "_id": 2, "product_name": "Samsung S"3", "category": "mobiles"