MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Ghi nhật ký các truy vấn MongoDB với Spring Boot

1. Tổng quan

Khi sử dụng Spring Data MongoDB, chúng ta có thể cần đăng nhập lên cấp cao hơn cấp mặc định. Thông thường, chúng ta có thể cần xem, ví dụ, một số thông tin bổ sung như thực thi câu lệnh hoặc tham số truy vấn.

Trong hướng dẫn ngắn này, chúng ta sẽ xem cách sửa đổi cấp độ ghi nhật ký MongoDB cho các truy vấn.

2. Định cấu hình ghi nhật ký truy vấn MongoDB

Hỗ trợ MongoDB cung cấp MongoOperations giao diện hoặc MongoTemplate chính của nó triển khai để truy cập dữ liệu, vì vậy tất cả những gì chúng ta cần là định cấu hình mức gỡ lỗi cho MongoTemplate lớp .

Giống như bất kỳ ứng dụng Spring hoặc Java nào, chúng tôi có thể sử dụng thư viện trình ghi nhật ký và xác định cấp độ ghi nhật ký cho MongoTemplate .

Thông thường, chúng tôi có thể viết vào tệp cấu hình của mình một cái gì đó như:

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

Tuy nhiên, nếu chúng tôi đang chạy ứng dụng Spring Boot , chúng tôi có thể định cấu hình điều này trong application.properties của chúng tôi tệp:

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

Tương tự như vậy, chúng tôi có thể sử dụng YAML cú pháp:

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

3. Lớp kiểm tra ghi nhật ký

Trước tiên, hãy tạo một Sách lớp:

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

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

    // getters and setters
}

Chúng tôi muốn tạo một lớp thử nghiệm đơn giản và kiểm tra nhật ký.

Để chứng minh điều này, chúng tôi sử dụng Embedded MongoDB. Để chắc chắn, trước tiên hãy kiểm tra các phần phụ thuộc của chúng tôi :

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

Cuối cùng, hãy xác định lớp thử nghiệm của chúng ta bằng 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. Mẫu nhật ký

Trong phần này, chúng tôi sẽ xác định một số trường hợp thử nghiệm đơn giản và hiển thị nhật ký tương đối để kiểm tra các trường hợp phổ biến nhất, chẳng hạn như tìm, chèn, cập nhật hoặc tổng hợp Tài liệu s.

4.1. Chèn

Trước tiên, hãy bắt đầu với việc chèn một Tài liệu :

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

mongoTemplate.insert(book);

Các bản ghi cho thấy chúng tôi đang chèn bộ sưu tập nào. Khi tìm thấy một Tài liệu , id cũng được ghi lại:

[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. Cập nhật

Tương tự như vậy, khi cập nhật một Tài liệu :

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

Chúng tôi có thể xem Tài liệu được cập nhật thực tế trường trong nhật ký:

[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. Chèn hàng loạt

Hãy thêm một ví dụ về chèn hàng loạt:

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

Chúng tôi có thể thấy số lượng Tài liệu được chèn vào s trong nhật ký:

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

4.4. Xóa

Ngoài ra, hãy thêm một ví dụ để loại bỏ:

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

mongoTemplate.insert(book);

mongoTemplate.remove(book);

Chúng tôi có thể thấy trong nhật ký, trong trường hợp này, là id của Tài liệu đã bị xóa :

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

4.5. Tổng hợp

Hãy xem một ví dụ cho Tổng hợp . Trong trường hợp này, chúng ta cần xác định một lớp kết quả. Ví dụ:chúng tôi sẽ tổng hợp theo tên tác giả:

public class GroupByAuthor {

    @Id
    private String authorName;
    private int authCount;

    // getters and setters
}

Tiếp theo, hãy xác định một trường hợp thử nghiệm để phân nhóm:

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

Chúng tôi có thể thấy trong nhật ký theo trường mà chúng tôi đã tổng hợp và loại đường dẫn tổng hợp:

[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. Cách thêm dữ liệu vào mảng trong Mongoose Schema

  2. SQL RPAD ()

  3. Truy vấn Mongo sử dụng mongoid trong ứng dụng rails gây ra lỗi hết thời gian chờ con trỏ

  4. Mongodb $ lookup Không hoạt động với _id

  5. Sao lưu cơ sở dữ liệu MongoDB bằng mongodump