sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan kan vi oprette autogenereret felt til mongodb ved hjælp af fjederstøvle

MongoDB kom med alle de sofistikerede ObjectId-genereringsfunktioner, men ofte hoppede du lige fra den relationelle database, og du vil stadig have et letlæseligt/kommunikere numerisk identifikationsfelt, som automatisk stiger hver gang en ny post indsættes.

Et godt forslag fra MongoDB tutorial er at bruge en tællersamling med et 'tællernavn' som id og et 'seq'-felt til at gemme det sidst brugte nummer.

Når du udvikler med Spring Data MongoDB, kan dette smarte trick skrives som en simpel service. Her brugte jeg samlingsnavnet som tællernavn, så det er nemt at gætte / huske.

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 er blot en simpel klasse, der repræsenterer samlingen. Vær venligst opmærksom på brugen af ​​int datatype, dette vil begrænse til 2^31 indgange maksimum.

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
}

Når du så indsætter en ny post (ved hjælp af Spring MongoDB Repository-understøttelse), skal du bare indstille id-feltet sådan her, før du gemmer det

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

baseQuestionRepository.save(baseQuestion);

Hvis du ikke kan lide denne måde, skal du bruge MongoDBEvents og bruge onBeforeConvert til at generere automatiseret værdi ved hjælp af samme fremgangsmåde ovenfor.

Ovenstående tilgang er også trådsikker, da findAndModify() er en trådsikker atommetode




  1. Node mongoose find forespørgsel i loop virker ikke

  2. Om MongoDB

  3. Hvordan eksporterer man samling til CSV i MongoDB?

  4. Introduktion til Redis-datastrukturer:Sorterede sæt