MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mencatat Kueri MongoDB dengan Spring Boot

1. Ikhtisar

Saat menggunakan Spring Data MongoDB, kita mungkin perlu login ke level yang lebih tinggi dari level default. Biasanya, kita mungkin perlu melihat, misalnya, beberapa informasi tambahan seperti eksekusi pernyataan atau parameter kueri.

Dalam tutorial singkat ini, kita akan melihat cara memodifikasi level logging MongoDB untuk kueri.

2. Konfigurasikan Logging Kueri MongoDB

Dukungan MongoDB menawarkan MongoOperations antarmuka atau MongoTemplate utamanya implementasi untuk mengakses data, jadi yang kita butuhkan hanyalah mengonfigurasi level debug untuk MongoTemplate kelas.

Seperti aplikasi Spring atau Java lainnya, kita dapat menggunakan library logger dan menentukan level logging untuk MongoTemplate .

Biasanya, kita dapat menulis di file konfigurasi kita seperti:

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

Namun, jika kita menjalankan aplikasi Spring Boot , kita dapat mengonfigurasinya di application.properties berkas:

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

Demikian juga, kita dapat menggunakan YAML sintaks:

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

3. Kelas Tes untuk Logging

Pertama, mari buat Buku kelas:

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

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

    // getters and setters
}

Kami ingin membuat kelas pengujian sederhana dan memeriksa log.

Untuk mendemonstrasikannya, kami menggunakan Embedded MongoDB. Untuk memastikannya, mari kita periksa dependensi kita terlebih dahulu :

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

Terakhir, mari kita definisikan kelas pengujian kita menggunakan 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. Contoh Log

Di bagian ini, kami akan mendefinisikan beberapa kasus pengujian sederhana dan menampilkan log relatif untuk menguji skenario yang paling umum, seperti menemukan, menyisipkan, memperbarui, atau menggabungkan Dokumen s.

4.1. Sisipkan

Pertama, mari kita mulai dengan memasukkan satu Dokumen :

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

mongoTemplate.insert(book);

Log menunjukkan koleksi mana yang kami masukkan. Saat menemukan Dokumen , id juga masuk:

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

Demikian juga, saat memperbarui Dokumen :

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

Kami dapat melihat Dokumen yang sebenarnya telah diperbarui bidang di log:

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

Mari tambahkan contoh untuk penyisipan 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);

Kita dapat melihat jumlah Dokumen yang disisipkan s di log:

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

4.4. Hapus

Juga, mari tambahkan contoh untuk menghapus:

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

mongoTemplate.insert(book);

mongoTemplate.remove(book);

Kita dapat melihat di log, dalam hal ini, id dari Dokumen . yang dihapus :

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

4.5. Agregasi

Mari kita lihat contoh untuk Agregasi . Dalam hal ini, kita perlu mendefinisikan kelas hasil. Misalnya, kami akan mengagregasi menurut nama penulis:

public class GroupByAuthor {

    @Id
    private String authorName;
    private int authCount;

    // getters and setters
}

Selanjutnya, mari kita definisikan kasus uji untuk pengelompokan:

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

Kami dapat melihat di log dengan bidang mana kami telah mengumpulkan dan jenis saluran agregasi apa:

[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. Bagaimana saya bisa memuat data dari koleksi mongodb ke dalam DataFrame panda?

  2. perbedaan luwak dari findOneAndUpdate dan update

  3. Bagaimana Operator Pembaruan $set Bekerja di MongoDB

  4. Kueri MongoDB $in dengan array elemen regex

  5. Bagaimana cara mendapatkan ukuran dokumen tunggal di Mongodb?