MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Регистриране на MongoDB заявки с Spring Boot

1. Общ преглед

Когато използваме Spring Data MongoDB, може да се наложи да влезем на по-високо ниво от това по подразбиране. Обикновено може да се наложи да видим, например, някаква допълнителна информация, като изпълнения на оператори или параметри на заявката.

В този кратък урок ще видим как да променим нивото на регистриране на MongoDB за заявки.

2. Конфигуриране на записване на заявки в MongoDB

Поддръжката на MongoDB предлага MongoOperations интерфейс или неговия основен MongoTemplate реализация за достъп до данни, така че всичко, от което се нуждаем, е да конфигурираме ниво за отстраняване на грешки за MongoTemplate клас.

Като всяко приложение на Spring или Java, можем да използваме библиотека за регистриране и да дефинираме ниво на регистриране за MongoTemplate .

Обикновено можем да запишем в нашия конфигурационен файл нещо като:

<logger name="org.springframework.data.mongodb.core.MongoTemplate" level="DEBUG" />

Ако обаче изпълняваме приложение Spring Boot , можем да конфигурираме това в нашите application.properties файл:

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

По същия начин можем да използваме YAML синтаксис:

logging:
  level:
    org:
      springframework:
        data:
          mongodb:
            core:
              MongoTemplate: DEBUG

3. Тестов клас за регистриране

Първо, нека създадем Книга клас:

@Document(collection = "book")
public class Book {

    @MongoId
    private ObjectId id;
    private String bookName;
    private String authorName;

    // getters and setters
}

Искаме да създадем прост тестов клас и да проверим регистрационните файлове.

За да демонстрираме това, използваме Embedded MongoDB. За да сме сигурни, нека първо проверим нашите зависимости :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <version>${embed.mongo.version}</version>
    <scope>test</scope>
</dependency>

И накрая, нека дефинираме нашия тестов клас, използвайки Spring Boot Test:

@SpringBootTest
@TestPropertySource(properties = { "logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG" })
public class LoggingUnitTest {

    private static final String CONNECTION_STRING = "mongodb://%s:%d";

    private MongodExecutable mongodExecutable;
    private MongoTemplate mongoTemplate;

    @AfterEach
    void clean() {
        mongodExecutable.stop();
    }

    @BeforeEach
    void setup() throws Exception {
        String ip = "localhost";
        int port = 27017;

        ImmutableMongodConfig mongodbConfig = MongodConfig.builder()
          .version(Version.Main.PRODUCTION)
          .net(new Net(ip, port, Network.localhostIsIPv6()))
          .build();

        MongodStarter starter = MongodStarter.getDefaultInstance();
        mongodExecutable = starter.prepare(mongodbConfig);
        mongodExecutable.start();
        mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test");
    }
    // tests
}

4. Проби от дневник

В този раздел ще дефинираме някои прости тестови случаи и ще покажем относителните регистрационни файлове за тестване на най-често срещаните сценарии, като например намиране, вмъкване, актуализиране или обобщаване на Документ с.

4.1. Вмъкване

Първо, нека започнем с вмъкване на един Документ :

Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");

mongoTemplate.insert(book);

Регистраторите показват в коя колекция вмъкваме. При намиране на Документ , идентификаторът също се записва:

[2022-03-20 17:42:47,093]-[main] DEBUG MongoTemplate - Inserting Document containing fields: [bookName, authorName, _class] in collection: book
...
[2022-03-20 17:42:47,144]-[main] DEBUG MongoTemplate - findOne using query: { "id" : { "$oid" : "623759871ff6275fe96a5ecb"}} fields: Document{{}} for class: class com.baeldung.mongodb.models.Book in collection: book
[2022-03-20 17:42:47,149]-[main] DEBUG MongoTemplate - findOne using query: { "_id" : { "$oid" : "623759871ff6275fe96a5ecb"}} fields: {} in db.collection: test.book

4.2. Актуализиране

По същия начин, когато актуализирате Документ :

Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");

mongoTemplate.insert(book);

String authorNameUpdate = "AuthorNameUpdate";

book.setAuthorName(authorNameUpdate);
mongoTemplate.updateFirst(query(where("bookName").is("Book")), update("authorName", authorNameUpdate), Book.class);

Можем да видим действително актуализирания Документ поле в регистрационните файлове:

[2022-03-20 17:48:31,759]-[main] DEBUG MongoTemplate - Calling update using query: { "bookName" : "Book"} and update: { "$set" : { "authorName" : "AuthorNameUpdate"}} in collection: book

4.3. Пакетно вмъкване

Нека добавим пример за групово вмъкване:

Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");

Book book1 = new Book();
book1.setBookName("Book1");
book1.setAuthorName("Author1");

mongoTemplate.insert(Arrays.asList(book, book1), Book.class);

Можем да видим броя на вмъкнатите документи s в регистрационните файлове:

[2022-03-20 17:52:00,564]-[main] DEBUG MongoTemplate - Inserting list of Documents containing 2 items

4.4. Премахване

Също така, нека добавим пример за премахване:

Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");

mongoTemplate.insert(book);

mongoTemplate.remove(book);

В регистрационните файлове, в този случай, можем да видим идентификатора на изтрития Документ :

[2022-03-20 17:56:42,151]-[main] DEBUG MongoTemplate - Remove using query: { "_id" : { "$oid" : "62375cca2a2cba4db774d8c1"}} in collection: book.

4.5. Агрегация

Нека видим пример за Агрегация . В този случай трябва да дефинираме резултатен клас. Например, ще обобщим по името на автора:

public class GroupByAuthor {

    @Id
    private String authorName;
    private int authCount;

    // getters and setters
}

След това нека дефинираме тестов случай за групиране:

Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");

Book book1 = new Book();
book1.setBookName("Book1");
book1.setAuthorName("Author");

Book book2 = new Book();
book2.setBookName("Book2");
book2.setAuthorName("Author");

mongoTemplate.insert(Arrays.asList(book, book1, book2), Book.class);

GroupOperation groupByAuthor = group("authorName")
  .count()
  .as("authCount");

Aggregation aggregation = newAggregation(groupByAuthor);

AggregationResults<GroupByAuthor> aggregationResults = mongoTemplate.aggregate(aggregation, "book", GroupByAuthor.class);

Можем да видим в регистрационните файлове по кое поле сме агрегирали и какъв вид конвейер за агрегиране:

[2022-03-20 17:58:51,237]-[main] DEBUG MongoTemplate - Executing aggregation: [{ "$group" : { "_id" : "$authorName", "authCount" : { "$sum" : 1}}}] in collection book

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB/NoSQL:Поддържане на историята на промените в документа

  2. Съвети за управление на архивиране на MongoDB за разчленени клъстери

  3. Свързване на MongoDB с Ruby със самоподписани сертификати за SSL

  4. Как да премахнете поле от документ на MongoDB ($unset)

  5. Как да проверите дали полето на масива съдържа уникална стойност или друг масив в MongoDB?