MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie können wir mit Spring Boot ein automatisch generiertes Feld für Mongodb erstellen?

MongoDB wurde mit allen ausgefeilten ObjectId-Generierungsfunktionen geliefert, aber oft sind Sie einfach von der relationalen Datenbank abgesprungen und möchten immer noch ein einfach zu lesendes / zu kommunizierendes numerisches Identifikatorfeld, das automatisch jedes Mal erhöht wird, wenn ein neuer Datensatz eingefügt wird.

Ein netter Vorschlag aus dem MongoDB-Tutorial ist die Verwendung einer Zählersammlung mit einem „Zählernamen“ als ID und einem „seq“-Feld zum Speichern der zuletzt verwendeten Nummer.

Bei der Entwicklung mit Spring Data MongoDB kann dieser nette Trick als einfacher Dienst geschrieben werden. Hier habe ich den Sammlungsnamen als Zählernamen verwendet, damit er leicht zu erraten/zu merken ist.

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 ist nur eine einfache Klasse, die die Sammlung darstellt. Bitte beachten Sie die Verwendung des int-Datentyps, dies wird auf maximal 2^31 Einträge begrenzt.

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
}

Wenn Sie dann einen neuen Eintrag einfügen (mit Hilfe der Spring MongoDB-Repository-Unterstützung), legen Sie das ID-Feld einfach so fest, bevor Sie es speichern

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

baseQuestionRepository.save(baseQuestion);

Wenn Ihnen dieser Weg nicht gefällt, müssen Sie MongoDBEvents verwenden und onBeforeConvert verwenden, um einen automatisierten Wert mit dem gleichen oben genannten Ansatz zu generieren.

Auch der obige Ansatz ist threadsicher, da findAndModify() eine threadsichere atomare Methode ist