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

Auto-genereret felt til MongoDB ved hjælp af Spring Boot

1. Oversigt

I denne øvelse skal vi lære, hvordan man implementerer et sekventielt, autogenereret felt til MongoDB i Spring Boot.

Når vi bruger MongoDB som databasen til en Spring Boot-applikation, kan vi ikke bruge @GeneratedValue anmærkning i vores modeller, da den ikke er tilgængelig. Derfor har vi brug for en metode til at producere den samme effekt, som vi vil have, hvis vi bruger JPA og en SQL-database.

Den generelle løsning på dette problem er enkel. Vi opretter en samling (tabel), der gemmer den genererede sekvens for andre samlinger. Under oprettelsen af ​​en ny post, bruger vi den til at hente den næste værdi.

2. Afhængigheder

Lad os føje følgende forårsstøvler til vores pom.xml :

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <versionId>2.2.2.RELEASE</versionId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
        <versionId>2.2.2.RELEASE</versionId>
    </dependency>
</dependencies>

Den seneste version af afhængighederne administreres af spring-boot-starter-parent .

3. Samlinger

Som diskuteret i oversigten opretter vi en samling, der gemmer den auto-inkrementerede sekvens for andre samlinger. Vi kalder denne samling database_sequences. Det kan oprettes ved at bruge enten mongo shell eller MongoDB Compass. Lad os oprette en tilsvarende modelklasse:

@Document(collection = "database_sequences")
public class DatabaseSequence {

    @Id
    private String id;

    private long seq;

    //getters and setters omitted
}

Lad os derefter oprette en bruger samling og et tilsvarende modelobjekt, der gemmer oplysningerne om personer, der bruger vores system:

@Document(collection = "users")
public class User {

    @Transient
    public static final String SEQUENCE_NAME = "users_sequence";

    @Id
    private long id;

    private String email;

    //getters and setters omitted
}

Bruger model oprettet ovenfor, tilføjede vi et statisk felt SEQUENCE_NAME, som er en unik reference til den automatiske sekvens for brugerne samling.

Vi annoterer det også med @Transient for at forhindre, at den forbliver sammen med andre egenskaber ved modellen.

4. Oprettelse af en ny post

Indtil videre har vi skabt de nødvendige kollektioner og modeller. Nu opretter vi en tjeneste, der genererer den automatisk forøgede værdi, der kan bruges som id for vores enheder.

Lad os oprette en SequenceGeneratorService der har generateSequence() :

public long generateSequence(String seqName) {
    DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),
      new Update().inc("seq",1), options().returnNew(true).upsert(true),
      DatabaseSequence.class);
    return !Objects.isNull(counter) ? counter.getSeq() : 1;
}

Nu kan vi bruge generateSequence() mens du opretter en ny post:

User user = new User();
user.setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
user.setEmail("[email protected]");
userRepository.save(user);

For at liste alle brugerne bruger vi UserRepository :

List<User> storedUsers = userRepository.findAll();
storedUsers.forEach(System.out::println);

Som det er nu, skal vi indstille id-feltet, hver gang vi opretter en ny forekomst af vores model. Vi kan omgå denne proces ved at oprette en lytter til Spring Data MongoDB livscyklusbegivenheder.

For at gøre det opretter vi en UserModelListener der udvider AbstractMongoEventListener og så tilsidesætter vi onBeforeConvert() :

@Override
public void onBeforeConvert(BeforeConvertEvent<User> event) {
    if (event.getSource().getId() < 1) {
        event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
    }
}

Nu, hver gang vi gemmer en ny bruger,  id indstilles automatisk.


  1. Redis INCRBY med grænser

  2. Hvordan håndterer MongoDB samtidige opdateringer?

  3. bruger $og med $match i mongodb

  4. Hvorfor bruger mongoDB objectID?