Перейти к основному содержимому

Регистрация запросов MongoDB с помощью Spring Boot

· 5 мин. чтения

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. Тестовый класс для ведения журнала

Во-первых, давайте создадим класс Book :

@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. Образцы журналов

В этом разделе мы определим несколько простых тестовых случаев и покажем относительные журналы для тестирования наиболее распространенных сценариев, таких как поиск, вставка, обновление или агрегирование Document s.

4.1. Вставлять

Во-первых, давайте начнем со вставки одного Document :

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

mongoTemplate.insert(book);

Логи показывают, в какую коллекцию мы вставляем. При поиске Document также регистрируется идентификатор:

[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.foreach.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);

Мы можем видеть количество вставленных Document 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. Агрегация

Давайте посмотрим на пример для Aggregation . В этом случае нам нужно определить класс результата. Например, мы будем агрегировать по имени автора:

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

5. Вывод

В этой статье мы рассмотрели, как включить уровень ведения журнала отладки для Spring Data MongoDB.

Мы определили несколько распространенных сценариев запросов и просмотрели их относительные журналы, выполняя некоторые живые тесты.

Как всегда, код этих примеров доступен на GitHub .