sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur kan vi skapa ett autogenererat fält för mongodb med fjäderstövel

MongoDB kom med alla sofistikerade ObjectId-genereringsfunktioner, men ofta hoppade du bara över skeppet från relationsdatabasen och du vill fortfarande ha ett lättläst/kommunicerande numeriskt identifierarfält som automatiskt ökar varje gång en ny post infogas.

Ett bra förslag från MongoDB-handledningen är att använda en räknarsamling med ett "räknarnamn" som id och ett "seq"-fält för att lagra det senast använda numret.

När du utvecklar med Spring Data MongoDB kan detta snygga trick skrivas som en enkel tjänst. Här använde jag samlingsnamnet som räknarnamn så det är lätt att gissa/minna.

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 är bara en enkel klass som representerar samlingen. Se upp för användningen av int-datatyp, detta kommer att begränsas till max 2^31 poster.

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
}

Sedan när du infogar en ny post (med hjälp av Spring MongoDB Repository-stöd), ställ bara in id-fältet så här innan du sparar det

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

baseQuestionRepository.save(baseQuestion);

Om du inte gillar det här sättet måste du använda MongoDBEvents och använda onBeforeConvert för att generera automatiskt värde med samma tillvägagångssätt ovan.

Också ovanstående tillvägagångssätt är trådsäkert eftersom findAndModify() är en trådsäker atommetod




  1. 2 sätt att ta bort en samling i MongoDB

  2. Node.js - Session kvarstår inte genom res.redirect()

  3. Mongoose - validera e-postsyntax

  4. Ansluter till Redis som körs i Docker Container från värddator