MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment pouvons-nous créer un champ généré automatiquement pour mongodb à l'aide de Spring Boot

MongoDB est livré avec toutes les fonctionnalités sophistiquées de génération d'ObjectId, mais souvent vous venez de sauter le navire de la base de données relationnelle, et vous voulez toujours un champ d'identifiant numérique facile à lire/communiquer qui s'incrémente automatiquement chaque fois qu'un nouvel enregistrement est inséré.

Une suggestion intéressante du didacticiel MongoDB consiste à utiliser une collection de compteurs avec un "nom de compteur" comme identifiant et un champ "seq" pour stocker le dernier numéro utilisé.

Lors du développement à l'aide de Spring Data MongoDB, cette astuce peut être écrite comme un service simple. Ici, j'ai utilisé le nom de la collection comme nom du compteur afin qu'il soit facile à deviner/mémoriser.

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 n'est qu'une simple classe représentant la collection. Veuillez faire attention à l'utilisation du type de données int, cela limitera à 2^31 entrées maximum.

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
}

Ensuite, lors de l'insertion d'une nouvelle entrée (avec l'aide du support Spring MongoDB Repository), définissez simplement le champ id comme celui-ci avant de l'enregistrer

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

baseQuestionRepository.save(baseQuestion);

Si vous n'aimez pas cette méthode, vous devez utiliser MongoDBEvents et utiliser onBeforeConvert pour générer une valeur automatisée en utilisant la même approche ci-dessus.

L'approche ci-dessus est également thread-safe car findAndModify() est une méthode atomique thread-safe