MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Automatycznie generowane pole dla MongoDB przy użyciu Spring Boot

1. Przegląd

W tym samouczku dowiemy się, jak zaimplementować sekwencyjne, automatycznie generowane pole dla MongoDB w Spring Boot.

Gdy używamy MongoDB jako bazy danych dla aplikacji Spring Boot, nie możemy użyć @GeneratedValue adnotacja w naszych modelach, ponieważ nie jest dostępna. Dlatego potrzebujemy metody, która dałaby ten sam efekt, co przy użyciu JPA i bazy danych SQL.

Ogólne rozwiązanie tego problemu jest proste. Stworzymy kolekcję (tabelę), która będzie przechowywać wygenerowaną sekwencję dla innych kolekcji. Podczas tworzenia nowego rekordu użyjemy go do pobrania następnej wartości.

2. Zależności

Dodajmy następujące startery wiosennego rozruchu do naszego 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>

Najnowszą wersją zależności zarządza spring-boot-starter-parent .

3. Kolekcje

Jak omówiono w omówieniu, utworzymy kolekcję, w której będzie przechowywana automatycznie inkrementowana sekwencja dla innych kolekcji. Nazwiemy tę kolekcję database_sequences. Można go utworzyć za pomocą mongo shell lub kompas MongoDB. Stwórzmy odpowiednią klasę modelu:

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

    @Id
    private String id;

    private long seq;

    //getters and setters omitted
}

Stwórzmy zatem użytkowników kolekcji i odpowiedniego obiektu modelu, który będzie przechowywać dane osób korzystających z naszego systemu:

@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żytkowniku utworzony powyżej model, dodaliśmy pole statyczne SEQUENCE_NAME, który jest unikalnym odniesieniem do automatycznie zwiększanej sekwencji dla użytkowników kolekcja.

Opatrujemy go również adnotacją @Transient aby zapobiec jego utrwalaniu wraz z innymi właściwościami modelu.

4. Tworzenie nowego rekordu

Do tej pory stworzyliśmy wymagane kolekcje i modele. Teraz utworzymy usługę, która wygeneruje automatycznie zwiększaną wartość, której można użyć jako id dla naszych podmiotów.

Utwórzmy SequenceGeneratorService który ma 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;
}

Teraz możemy użyć generateSequence() podczas tworzenia nowego rekordu:

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

Aby wyświetlić listę wszystkich użytkowników, użyjemy UserRepository :

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

Podobnie jak teraz, musimy ustawić pole id za każdym razem, gdy tworzymy nową instancję naszego modelu. Możemy obejść ten proces, tworząc detektor zdarzeń cyklu życia Spring Data MongoDB.

W tym celu utworzymy UserModelListener który rozszerza AbstractMongoEventListener a następnie zastąpimy funkcję onBeforeConvert() :

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

Teraz za każdym razem, gdy zapisujemy nowego użytkownika identyfikator zostanie ustawiony automatycznie.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bazy danych dokumentów:nadmiarowe dane, referencje itp. (w szczególności MongoDB)

  2. Pierwsze kroki z nierelacyjnymi bazami danych przy użyciu Mongodb

  3. Jak znaleźć dokumenty spełniające wiele kryteriów

  4. MongoDB:sprawdź połączenie z DB

  5. MongoDB $slice