jmoordb
  • Introduction
  • Overview
    • Copyleft
    • Prefacio
    • Creditos
    • Autor
    • Introduccion
  • Capitulo 1
    • Capítulo 1. Jmoordb
      • Base de Datos NoSQL
      • Esquema jmoordb
      • MongoDB
        • Instalar desde repositorio
        • Instalar MongoDB desde zip
        • Instalar Mongodb con Docker
        • Crear archivo mongodb.conf
        • Crear usuario de la base de datos
        • Conectarse a la base de datos con usuario y password
        • Optimizar MongoDB
        • Seguridad mongodb
      • OrientDB
      • Couchbase
      • Dependencias
      • MongoClientProvider
      • CouchbaseClientProvider
      • Bean Validation
      • Clases Internas
        • JmoordbNotifications.java
      • Interfaces
      • Configuracion del stack
      • Conexion a Base de datos
      • Conexión mediante Microservicios
  • Capitulo 2
    • Capítulo 2. Entidades y Repository
      • Entity
      • Anotaciones
      • Documento Embebido
      • Documento Embebido como Historial
      • Embebido con List de Referenciado
      • Documento Referenciado
      • Repository MongoDB
      • Repository Couchbase
      • Save
      • Update
      • Delete
      • Repository
  • Capitulo 3
    • Capítulo 3. Búsquedas
      • Búsquedas findById
      • findBySecondaryKey()
      • isFoundBySecondaryKey()
      • Busquedas find
      • Busquedas @Embedded
      • Busquedas @Referenced
      • Busquedas findAll
      • Búsquedas findBy
      • Busquedas findPagination
      • Busquedas findFirst
  • Capitulo Llaves primarias y secundarias
    • Capitulo Llaves primarias y secundarias
    • List<FieldBeans> fieldsOfBean()
    • Autoincrementable
  • Capitulo UserInfo
    • Capitulo UserInfo
  • Capitulo Profiles
    • Capitulo Profiles
  • Capitulo 4
    • Capitulo 4. Busquedas avanzadas
      • Buscar y actualizar automaticamente
      • Autoincrementable secundarios
      • Búsquedas Expresiones Regulares (Patrones Like)
      • Búsquedas por Texto findText
      • Busquedas con Helpers
      • Busquedas con Filter and Pagination
      • Full Text Search service
      • Busqueda entre enteros filterBetweenInteger
      • Busquedas en Rango de Doubles
      • Shell
  • Capitulo 5. Búsqueda en Documentos Embebidos
    • Capitulo 5. Búsqueda en Documentos Embebidos
      • Buscar elemento en un List<> Embebido/Referenciado
      • Filtros entre fechas en List<entity> embebidos
  • Capitulo 6. Busquedas en Fechas
    • Capitulo 6. Busquedas en Fechas
      • Busqueda entre Fechas filterBetweenDate()/filterBetweenDateWithoutHours()
      • betweendateWithFilter
      • Búsquedas por Día filterDayWithoutHour()
      • Disponible entre dos fechas en rangos de fechas inicial y final
      • Autocomplete disponibles en base a rango de dos fechas seleccionadas
      • Autocomplete en rangos de fechas excluyendo el mismo entity
      • Utilidades para Fechas
  • Capitulo 7 Aggregation
    • Capitulo 7 Aggregation
      • Introduccion Aggregation
      • Ejemplo $match
      • Ejemplo $group
      • Ejemplo $match, $group combinado
      • Ejemplo $lookup
      • Aggregation en ;MongoDB
  • Capitulo 8
    • Capitulo 8. Utilidades Bases datos
      • Restaurar base datos
      • internalQueryExecMaxBlockingSortBytes
      • Statistics
      • count
      • sizeOfPage
      • Indices
      • Crear Indice Primario
      • Lista de colecciones
      • Crear una coleccion
      • Eliminar una coleccion
      • Convertir Entity a documento
      • Eliminar base datos
      • Desconectar
      • Agregar campo a todos los documentos
      • ListOfPage
      • Importar un json a MongoDB
      • Migrar desde MySQL a MongoDB
      • updateOne
      • updateMany
      • Copiar base de datos
      • Migrar desde un archivo sql a mongodb
      • Cambiar el nombre de un campo
      • Exportar a csv
      • update field
      • Ver listado de colecciones
      • Eliminar un campo
      • Incrementar valor de campos
      • Tipos enteros
      • Agrupar y contar
      • iterate Cursor
      • Estadisticas
      • SQL vs MongoDB
      • not
      • Videos
      • Crear colleccion
      • Combinar bases de datos
      • sortConstructor
      • filterEQBuilder
      • documentToJson/jsonToDocument
      • Renombrar base de datos
      • Consultas $ne
      • Consulta entre Fechas
      • Consultas And
      • Consulta compleja
      • Contar registros complejos
      • Agregar un campo en una consulta compleja
      • Actualizacion compleja
      • Actualizar enteros mediante or
  • Capitulo 9 ACID Transactions Aun no implementado
    • Capitulo 9 ACID Transactions
      • ejemplos ACID
  • Capitulo 10. Bases datos sin esquema
    • Capitulo 10. Bases datos sin esquema
      • Insertar, Actualizar, Eliminar
  • Capítulo 11
    • Capitulo 11. Aplicación Java SE MongoDB
      • Base de datos
      • Proyecto Maven
      • Clase MongoClientProvider
      • Clase Entity
      • Clase Repository
      • Clase Controller
      • Clase Main
  • Capítulo 12
    • Capítulo 12 Java EE
      • Proyecto Maven Web
      • Dependencias web
      • Clase MongoClientProvider Web
      • Entity Web
      • Interfaces Web
      • Repository Web
      • Controller Web
      • Pagina Web
  • Capitulo 13. Couchbase
    • Capitulo 13 Couchbase
      • Base datos couchbase
      • Entity Couchbase
      • Dependencias Maven Couchbase
      • Couchabase Provider para el Ejemplo Couchbase
      • Repository Couchbase
      • Controller Couchbase
  • Capitulo 14 Auditoria
    • Capitulo 14 Auditoria
      • Introduccion
      • Implementación Repository de Auditoria
      • Historial de Acceso
      • Historial de Operaciones sobre documentos
      • Historial de Revisiones
    • SQL
  • Referencias
    • Referencias
      • Referencias importantes
Powered by GitBook
On this page
  • Ejemplo 1:
  • Crear el Repository.
  • Autoincrementable como campo llave
  • Controller
  • Ejemplo 2:
  • Análisis de autoincrementables

Was this helpful?

  1. Capitulo 4
  2. Capitulo 4. Busquedas avanzadas

Buscar y actualizar automaticamente

PreviousCapitulo 4. Busquedas avanzadasNextAutoincrementable secundarios

Last updated 3 years ago

Was this helpful?

Muchas veces necesitamos incrementar el valor de un campo y retornarlo, por ejemplo para atributos autoincrementable.

Por ejemplo en bases de datos NoSQL como MongoDB no existe el concepto de autoincrementable.

Métodos:

Métodos

Bases de datos NoSQL

public T findOneAndUpdate(String key, String value,String field,Integer... incremento)

MongoDB

public T findOneAndUpdate(Document doc, String field, Integer... incremento)

MongoDB

public T findOneAndUpdate(Document doc, Document inc, Integer... incremento)

MongoDB

Parámetros

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

Nota: A partir de la versión 0.2.9 se definió esta clase dentro de JMoordb, no es necesario declarar el entity

Definir el entity: Autoincrementable

@Getter
@Setter
public class Autoincrementable {
  @Id
  private String documento;
  private Integer contador;
  public Autoincrementable() {
  }

 public Autoincrementable(String documento, Integer contador) {
    this.documento = documento;
    this.contador = contador;
 }
  @Override
  public String toString() {
      return "Autoincrementable{" + "documento=" + documento + ", contador=" + contador + '}';
  }
}

Ejemplo 1:

Nota:

Recuerde que no es necesario crear la clase Autoincrementable, este pertenece al framework.

Crear el Repository.

@Stateless
public class AutoincrementableRepository extends AbstractFacade<Autoincrementable> {

    @EJB
    MongoClientProvider mongoClientProvider;
    @Override
    protected MongoClient getMongoClient() {
       return mongoClientProvider.getMongoClient();
    }
    public AutoincrementableFacade(){
        super(Autoincrementable.class,"spardjsd","autoincrementable");
    }
    @Override
    public Object findById(String key, String value) {
       return search(key,value); 
    }
    @Override
    public Object findById(String key, Integer value) {
        return search(key,value);
    }

}

Autoincrementable como campo llave

Contamos con una colección para almacenar facturas, y el atributo idfactura debe incrementarse automáticamente.

  @Getter
  @Setter
  public class Facturas {

  @Id
  private Integer idfactura;
  private Double ventas;

  public Facturas() {
  }

  public Facturas(Integer idfactura, Double ventas) {
      this.idfactura = idfactura;
     this.ventas = ventas;
  }

 @Override
  public String toString() {
      return "Facturas{" + "idfactura=" + idfactura + ", ventas=" + ventas + '}';
  }

 }

Crear una colección para que lleve el contador de los documentos y sus id que se usan en otras colecciones.

Controller

Debemos inicializar el documento Autoincrementable, donde le indicamos el nombre del documento y el contador iniciar para llevar el control. Todos los documentos que se desee controlar su autoincrementable deben ser almacenados aquí. En el ejemplo lo inicializamos en 0.

 public void iniciarAutoicrementable(){
    try {
        Autoincrementable autoincrementable = new Autoincrementable("facturas", 0);
        if(autoincrementableRepository.save(autoincrementable)){
              System.out.println("guardado "); 
        }else{
            System.out.println("no se guardo "+autoincrementableRepository.getException());
        }


    } catch (Exception e) {
        System.out.println("iniciarAutoincrementable() "+e.getLocalizedMessage());

    }
}

Si consultamos el documento

db.autoincrementable.find().pretty()
{ "_id" : ObjectId("58861fdba6cca9146fbb2039"), "documento" : "facturas", "contador" : 0 }

Guardar una factura

public void guardarFactura() {
    try {
        //Busca el contador de facturas, lo incrementa en uno  y devuelve el objeto.
        Autoincrementable autoincrementable = new Autoincrementable();
        autoincrementable = autoincrementableFacade.findOneAndUpdate("documento", "facturas", "contador");
        Integer id = autoincrementable.getContador();

       //Guarda la factura
        Facturas facturas = new Facturas();
        facturas.setIdfactura(id);
        facturas.setVentas(5085.23);
        if (facturasRepository.save(facturas)) {
            System.out.println("guardado");
        } else {
            System.out.println("No se guardo " + facturasRepository.getException());
        }

    } catch (Exception e) {
        System.out.println("guardarFactura() " + e.getLocalizedMessage());
    }
}

Si consultamos la colección autoincrementable, podemos comprobar que se consulto el documento facturas y automáticamente se incremento en uno el valor del contador.

db.autoincrementable.find().pretty()                                                            
{
    "_id" : ObjectId("58861fdba6cca9146fbb2039"),
    "documento" : "facturas",
    "contador" : 1   
}

Si consultamos la colección facturas

db.facturas.find().pretty()                                                     
{
    "_id" : ObjectId("58863489a6cca91a36d27b3a"),
    "idfactura" : 1,
    "ventas" : 5085.23
}

Ejemplo 2:

Autoincremantable en un atributo que no es llave primaria.

En el método save() , verificamos si no se ha creado un registro autoincrementable y lo creamos.

//verifica si no se ha creado el contador para proveedor
            Optional<Autoincrementable> autoincrementableOptional = autoincrementableRepository.find(new Document("documento", "proveedor"));
            if (!autoincrementableOptional.isPresent()) {

                Autoincrementable autoincrementable = new Autoincrementable("proveedor", 0);
                if (autoincrementableFacade.save(autoincrementable)) {
                }
            }

        Autoincrementable autoincrementable = new Autoincrementable();
        autoincrementable = autoincrementableRepository.findOneAndUpdate("documento", "proveedor", "contador");
        Integer id = autoincrementable.getContador();
        proveedor.setAutoincrementable(id);
            if (proveedorRepository.save(proveedor)) {
                JsfUtil.successMessage(rf.getAppMessage("info.save"));
                reset();
            } else {
                JsfUtil.successMessage("save() " + proveedorFacade.getException().toString());
            }

Análisis de autoincrementables

Ejemplo del porque se implementa findOneAndUpdate()

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 tendría 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"}

De esta manera en la colección Agenda utilizara el valor que devuelva el campo valor de la colección

Autoincrementable.

El método findOneAndUpdate() busca el documento que cumpla la condición y realiza el incremento automático y devuelve el documento actualizado.

// incrementa en 1 el campo Valor

findOneAndUpdate("documento", "agenda", "valor");

// incrementa en 8 el campo Valor, le podemos indicar el valor que deseamos de incremento

findOneAndUpdate("documento", "agenda", "valor",8);

Al insertarlo quedaría de la siguiente manera:

Incrementa el campo valor y devuelve el documento actualizadoAutoincrementable{"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"}**

Código en Java:

Autoincrementable autoincrementable = new Autoincrementable();

autoincrementable=autoincrementableRepository.findOneAndUpdate("documento", "agenda", "valor");

agenda.setIdagenda(autoincrementable.getValor());