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

Automaticky generované pole pro MongoDB pomocí Spring Boot

1. Přehled

V tomto tutoriálu se naučíme, jak implementovat sekvenční, automaticky generované pole pro MongoDB v aplikaci Spring Boot.

Když používáme MongoDB jako databázi pro aplikaci Spring Boot, nemůžeme použít @GeneratedValue anotace v našich modelech, protože není k dispozici. Proto potřebujeme metodu, která vyvolá stejný efekt, jaký budeme mít, pokud použijeme JPA a SQL databázi.

Obecné řešení tohoto problému je jednoduché. Vytvoříme kolekci (tabulku), která bude ukládat vygenerovanou sekvenci pro další kolekce. Během vytváření nového záznamu jej použijeme k načtení další hodnoty.

2. Závislosti

Přidejme do našeho pom.xml následující jarní startéry :

<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>

Nejnovější verzi závislostí spravuje spring-boot-starter-parent .

3. Sbírky

Jak je uvedeno v přehledu, vytvoříme kolekci, která bude ukládat automaticky inkrementovanou sekvenci pro další kolekce. Tuto kolekci budeme nazývat databázové_sekvence. Lze jej vytvořit buď pomocí mongo shell nebo MongoDB Compass. Vytvořme odpovídající třídu modelu:

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

    @Id
    private String id;

    private long seq;

    //getters and setters omitted
}

Pojďme vytvořit uživatele kolekce a odpovídající modelový objekt, který bude ukládat podrobnosti o lidech, kteří používají náš systém:

@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
}

Uživatel výše vytvořeného modelu jsme přidali statické pole SEQUENCE_NAME, což je jedinečný odkaz na automaticky inkrementovanou sekvenci pro uživatele kolekce.

Také jej označíme znakem @Transient aby se zabránilo jeho přetrvání spolu s ostatními vlastnostmi modelu.

4. Vytvoření nového záznamu

Zatím jsme vytvořili požadované kolekce a modely. Nyní vytvoříme službu, která bude generovat automaticky navýšenou hodnotu, kterou lze použít jako id pro naše subjekty.

Pojďme vytvořit SequenceGeneratorService který má 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;
}

Nyní můžeme použít generateSequence() při vytváření nového záznamu:

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

K zobrazení seznamu všech uživatelů použijeme UserRepository :

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

Jak je tomu nyní, musíme nastavit pole id pokaždé, když vytvoříme novou instanci našeho modelu. Tento proces můžeme obejít vytvořením posluchače událostí životního cyklu Spring Data MongoDB.

Za tímto účelem vytvoříme UserModelListener který rozšiřuje AbstractMongoEventListener a poté přepíšeme onBeforeConvert() :

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

Nyní pokaždé, když uložíme nového uživatele  id se nastaví automaticky.


  1. Vytvoření otevřeného standardu:Řízení strojového učení pomocí Apache Atlas

  2. Použití záloh k opravě běžných scénářů selhání pro MongoDB

  3. Optimalizovaný způsob dotazování v MongoDB pomocí $in vs $or

  4. Další vlastnosti ověření MongoDB jsonSchema