Existen muchas maneras de administrar campos autoincrementables, en esta ocasión mostrare la implementación que use en JGMongo https://github.com/avbravo/jgmongo/ utilizando en metodo findOneAndUpdate().
Código en Java
Implementaremos el método de la clase AbstractFacade
public T findOneAndUpdate(String key, String value,String field,Integer... incremento)
Key : es el campo a buscar
value: el valor de ese campo
field: es el campo numérico a implementar
incremento: Opcional si no se pasa ningún valor incrementa en uno el campo
Problema 1:
Existe una colección de documentos donde se maneja un campo entero que funcionara como autoincrementable:
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"C"}
- Si se elimina el evento 3,
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"}
- Cuando se desee insertar un documento con el {"evento":"D"}, se pueden producir algunas situaciones
1. Utilizar la función count() para conocer la cantidad de documentos que tiene la colección, este devolverá 2 y al sumarle 1 tendrá el valor de 3, que ya fue usado para el {"evento":"C"}.
Al insertarlo quedaría de la siguiente manera:
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"D"}
2. Si buscamos el ultimo documento de la colección {"Id":2,"evento":"B"} , el valor del id es 2 al sumarle 1 quedara en 3, por lo tanto al insertar el evento {"evento":"D"} a la colección este tendria el valor de 3 para el id y este ya fue usado en el {"evento" :"C"}.
Al insertarlo quedaría de la siguiente manera:
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":3,"evento":"D"}
Utilizando findOneAndUpdate()
1- Crear una colección para que lleve el contador de los documentos y sus id que se usan en otras colecciones. Autoincrementable{"Documento":"Agenda","Valor":1}
De esta manera en la colección Agenda utilizara el valor que devuelva el campo valor de la colección Autoincrementable.
El metodo findOneAndUpdate() busca el documento que cumpla la condición y realiza el incremento automático y devuelve el documento actualizado.
- findOneAndUpdate("Documento", "Agenda", "Valor"); // incrementa en 1 el campo Valor
- findOneAndUpdate("Documento", "Agenda", "Valor",8); // incrementa en 8 el campo Valor, le podemos indicar el valor que deseamos de incremento
Al insertarlo quedaría de la siguiente manera:
Incrementa el campo valor y devuelve el documento actualizado
Autoincrementable{"Documento":"Agenda","Valor":4}
y este se asigna al id de la colección Agenda
Agenda{"Id":1,"evento":"A"},{"Id":2,"evento":"B"},{"Id":4,"evento":"D"}
Autoincrementable autoincrementable = new Autoincrementable();
autoincrementable=autoincrementableFacade.findOneAndUpdate("Documento", "Agenda", "Valor");
agenda.setIdagenda(autoincrementable.getValor());
Comments