sql >> Database >  >> NoSQL >> MongoDB

Hoe kunnen we een automatisch gegenereerd veld voor mongodb maken met springboot?

MongoDB kwam met alle geavanceerde functies voor het genereren van ObjectId, maar vaak ben je net uit de relationele database gesprongen en wil je nog steeds een gemakkelijk te lezen / communiceren numeriek identificatieveld dat automatisch wordt verhoogd telkens wanneer een nieuw record wordt ingevoegd.

Een leuke suggestie van de MongoDB-zelfstudie is om een ​​tellerverzameling te gebruiken met een 'tellernaam' als id en een 'seq'-veld om het laatst gebruikte nummer op te slaan.

Bij het ontwikkelen met Spring Data MongoDB kan deze handige truc worden geschreven als een eenvoudige service. Hier heb ik de collectienaam als tellernaam gebruikt, dus het is gemakkelijk te raden/onthouden.

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 is slechts een eenvoudige klasse die de verzameling vertegenwoordigt. Pas op voor het gebruik van het gegevenstype int, dit beperkt zich tot maximaal 2^31 ingangen.

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
}

Wanneer u vervolgens een nieuw item invoegt (met hulp van Spring MongoDB Repository-ondersteuning), stelt u het id-veld zo in voordat u het opslaat

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

baseQuestionRepository.save(baseQuestion);

Als je deze manier niet leuk vindt, moet je MongoDBEvents gebruiken en onBeforeConvert gebruiken om geautomatiseerde waarde te genereren met dezelfde bovenstaande benadering.

Ook de bovenstaande benadering is threadsafe, aangezien findAndModify() een threadveilige atomaire methode is




  1. Fout:geen ondersteuning voor unix-sockets op Windows die mongodb verbindt

  2. MongoDB Date()-methode

  3. ondersteunt hibernate-redis cache op het tweede niveau die wordt gedeeld door verschillende hibernate-instanties?

  4. De meest efficiënte manier om meerdere hashes in Redis te krijgen?