sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo podemos crear un campo generado automáticamente para mongodb usando Spring Boot?

MongoDB vino con todas las características sofisticadas de generación de ObjectId, pero a menudo simplemente saltó el barco de la base de datos relacional y aún desea un campo de identificador numérico fácil de leer/comunicar que se incrementa automáticamente cada vez que se inserta un nuevo registro.

Una buena sugerencia del tutorial de MongoDB es usar una colección de contadores con un 'nombre de contador' como su id, y un campo 'seq' para almacenar el último número usado.

Al desarrollar usando Spring Data MongoDB, este ingenioso truco se puede escribir como un servicio simple. Aquí usé el nombre de la colección como el nombre del contador para que sea fácil de adivinar/recordar.

import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import com.model.CustomSequences;


@Service
public class NextSequenceService {
    @Autowired private MongoOperations mongo;

    public int getNextSequence(String seqName)
    {
        CustomSequences counter = mongo.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq",1),
            options().returnNew(true).upsert(true),
            CustomSequences.class);
        return counter.getSeq();
    }
}

CustomSequences es solo una clase simple que representa la colección. Tenga cuidado con el uso del tipo de datos int, esto se limitará a 2^31 entradas como máximo.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "customSequences")
public class CustomSequences {
    @Id
    private String id;
    private int seq;

// getters and setters
}

Luego, al insertar una nueva entrada (con la ayuda del soporte de Spring MongoDB Repository), simplemente configure el campo de identificación de esta manera antes de guardarlo

BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */

baseQuestionRepository.save(baseQuestion);

Si no le gusta esta forma, entonces necesita usar MongoDBEvents y usar onBeforeConvert para generar valor automatizado usando el mismo enfoque anterior.

También el enfoque anterior es seguro para subprocesos ya que findAndModify() es un método atómico seguro para subprocesos