sql >> Databáze >  >> NoSQL >> MongoDB

Jak můžeme vytvořit automaticky generované pole pro mongodb pomocí spring boot

MongoDB přišel se všemi sofistikovanými funkcemi generování ObjectId, ale často jste právě přeskočili loď z relační databáze a stále chcete snadno čitelné/komunikující pole číselného identifikátoru, které se automaticky zvyšuje pokaždé, když je vložen nový záznam.

Jeden úhledný návrh z MongoDB tutoriálu je použít sbírku počítadel s ‚název čítače‘ jako id a pole ‚seq‘ k uložení posledního použitého čísla.

Při vývoji pomocí Spring Data MongoDB lze tento úhledný trik napsat jako jednoduchou službu. Zde jsem jako název počítadla použil název sbírky, takže jej lze snadno uhodnout / zapamatovat.

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 je jen jednoduchá třída představující kolekci. Dejte si prosím pozor na použití datového typu int, toto omezí maximálně 2^31 záznamů.

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
}

Poté při vkládání nového záznamu (s pomocí podpory Spring MongoDB Repository) stačí před uložením nastavit pole id takto

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

baseQuestionRepository.save(baseQuestion);

Pokud se vám tento způsob nelíbí, musíte použít MongoDBEvents a použít onBeforeConvert ke generování automatizované hodnoty pomocí stejného výše uvedeného přístupu.

Výše uvedený přístup je také bezpečný pro vlákna, protože findAndModify() je atomická metoda bezpečná pro vlákna




  1. Jedna publikace skrývá vnořená pole z jiné publikace

  2. Vkládání dat do vnořeného pole v mongodb

  3. Python-redis:získat binární data poté, co byl klient nastaven s decode_responses=True

  4. Mongo nemůže nastartovat