MongoDB Auto Incremento
MongoDB no tiene una función de auto incremento como SQL. El _id de MongoDB es un identificador único de 12 bytes generado automáticamente por el sistema.
Pero en algunos casos, es posible que necesitemos implementar la función de auto incremento de ObjectId.
Dado que MongoDB no implementa esta función, podemos implementarla mediante programación. A continuación implementaremos el auto incremento del campo _id en la colección counters.
Usar la colección counters
Considere el siguiente documento products. Queremos que el campo _id implemente la función de auto incremento de 1, 2, 3, 4 a n.
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
Para ello, cree una colección counters; el valor del campo de secuencia puede lograr auto incremento:
>db.createCollection("counters")
Ahora insertamos el siguiente documento en la colección counters, usando productid como clave (key):
{
"_id":"productid",
"sequence_value": 0
}
El campo sequence_value es un valor después de que la secuencia pasa por auto incremento.
Use el siguiente comando para insertar en el documento de secuencia de la colección counters:
>db.counters.insert({_id:"productid",sequence_value:0})
Crear función de Javascript
Ahora, creamos la función getNextSequenceValue para tomar como entrada el nombre de la secuencia. La secuencia especificada aumentará automáticamente en 1 y devolverá el valor de secuencia más reciente. En el ejemplo de este artículo, el nombre de la secuencia es productid.
>function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify(
{
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
"new":true
});
return sequenceDocument.sequence_value;
}
Usar la función de Javascript
A continuación, usaremos la función getNextSequenceValue para crear un nuevo documento y estableceremos el _id del documento automáticamente al valor de secuencia devuelto:
>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 puedes ver, usamos la función getNextSequenceValue para establecer el campo _id.
Para verificar si la función es válida, podemos usar el siguiente comando para leer el documento:
>db.products.find()
El comando anterior devolverá los siguientes resultados; encontramos que el campo _id es autoincremental:
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
Otras extensiones