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