sql >> Database >  >> NoSQL >> MongoDB

MongoDB-query's loggen met Spring Boot

1. Overzicht

Wanneer we Spring Data MongoDB gebruiken, moeten we mogelijk inloggen op een hoger niveau dan het standaardniveau. Meestal moeten we bijvoorbeeld wat aanvullende informatie zien, zoals uitvoeringen van instructies of queryparameters.

In deze korte zelfstudie zullen we zien hoe u het MongoDB-registratieniveau voor query's kunt wijzigen.

2. MongoDB Queries Logging configureren

MongoDB Support biedt de MongoOperations interface of zijn primaire MongoTemplate implementatie om toegang te krijgen tot gegevens, dus alles wat we nodig hebben is het configureren van een debug-niveau voor de MongoTemplate klasse.

Zoals elke Spring- of Java-toepassing kunnen we een loggerbibliotheek gebruiken en een logboekniveau definiëren voor MongoTemplate .

Meestal kunnen we in ons configuratiebestand iets schrijven als:

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

Als we echter een Spring Boot-toepassing gebruiken , we kunnen dit configureren in onze application.properties bestand:

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

Evenzo kunnen we de YAML . gebruiken syntaxis:

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

3. Testklasse voor logboekregistratie

Laten we eerst een Boek maken klas:

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

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

    // getters and setters
}

We willen een eenvoudige testklasse maken en logs bekijken.

Om dit aan te tonen, gebruiken we Embedded MongoDB. Laten we voor de zekerheid eerst onze afhankelijkheden controleren :

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

Laten we tot slot onze testklasse definiëren met behulp van 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. Logvoorbeelden

In deze sectie zullen we enkele eenvoudige testgevallen definiëren en de relatieve logboeken weergeven om de meest voorkomende scenario's te testen, zoals het vinden, invoegen, bijwerken of samenvoegen van Document v.

4.1. Invoegen

Laten we eerst beginnen met het invoegen van een enkel Document :

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

mongoTemplate.insert(book);

De logs laten zien in welke collectie we invoegen. Bij het vinden van een Document , de id wordt ook gelogd:

[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. Bijwerken

Evenzo, bij het bijwerken van een Document :

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

We kunnen het daadwerkelijke bijgewerkte Document zien veld in de logs:

[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. Batch invoegen

Laten we een voorbeeld toevoegen voor het invoegen van een batch:

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

We kunnen het aantal ingevoegde Documenten zien s in de logs:

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

4.4. Verwijderen

Laten we ook een voorbeeld toevoegen voor het verwijderen:

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

mongoTemplate.insert(book);

mongoTemplate.remove(book);

We kunnen in de logs zien, in dit geval, de id van het verwijderde Document :

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

4.5. Aggregatie

Laten we een voorbeeld bekijken voor Aggregatie . In dit geval moeten we een resultaatklasse definiëren. We verzamelen bijvoorbeeld op naam van de auteur:

public class GroupByAuthor {

    @Id
    private String authorName;
    private int authCount;

    // getters and setters
}

Laten we vervolgens een testcase voor groeperen definiëren:

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

We kunnen in de logboeken zien op welk veld we hebben geaggregeerd en wat voor soort aggregatiepijplijn:

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

  1. Een generieke RedisTemplate opdrogen in het voorjaar 4

  2. Hoe MongoDB op Windows-systeem te installeren?

  3. Hoe dubbele vermeldingen uit een array te verwijderen?

  4. Celery gebruiken voor realtime, synchrone externe API-query's met Gevent