sql >> データベース >  >> NoSQL >> MongoDB

SpringBootを使用したMongoDBクエリのログ記録

    1。概要

    Spring Data MongoDBを使用する場合、デフォルトよりも高いレベルにログを記録する必要がある場合があります。通常、たとえば、ステートメントの実行やクエリパラメータなどの追加情報を確認する必要があります。

    この短いチュートリアルでは、クエリのMongoDBロギングレベルを変更する方法を説明します。

    2。 MongoDBクエリログの構成

    MongoDBサポートはMongoOperationsを提供します インターフェイスまたはそのプライマリMongoTemplate データにアクセスするための実装なので、必要なのは MongoTemplateのデバッグレベルを構成することだけです。 クラス

    他のSpringまたはJavaアプリケーションと同様に、ロガーライブラリを使用して、 MongoTemplateのログレベルを定義できます。

    通常、構成ファイルには次のように書き込むことができます。

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

    ただし、SpringBootアプリケーションを実行している場合これは 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
    }

    簡単なテストクラスを作成し、ログをチェックアウトしたいと思います。

    これを実証するために、EmbeddedMongoDBを使用します。確かに、最初に依存関係を確認しましょう

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

    最後に、SpringBootTestを使用してテストクラスを定義しましょう。

    @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。ログサンプル

    このセクションでは、いくつかの簡単なテストケースを定義し、相対的なログを表示して、ドキュメントの検索、挿入、更新、集計など、最も一般的なシナリオをテストします。 s。

    4.1。挿入

    まず、単一のドキュメントを挿入することから始めましょう。 :

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

    ログには、挿入するコレクションが表示されます。 ドキュメントを見つけるとき 、IDもログに記録されます:

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

    ログで確認できます。この場合は、削除されたドキュメントのIDです。 :

    [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. MongooseはMongodbの`findAndModify`メソッドをサポートしていますか?

    2. RedisからのUnicodeのカプセル化

    3. マングーススキーマ参照と未定義のタイプ'ObjectID'

    4. 文字列をmongodbで日付に変換する