JPA có hoạt động với MongoDB không?

Nếu bạn đã làm việc với Spring Data JPA trong một khoảng thời gian bất kỳ - có thể bạn đã quen thuộc với các phương thức truy vấn dẫn xuất

@Repository
public interface BookRepository extends MongoRepository {
   List findByAuthor(String name);
}

Chúng là một cách tiện lợi và nhanh chóng để giảm bớt gánh nặng viết truy vấn vào Spring Data JPA bằng cách chỉ cần xác định tên phương thức

Trong tình huống giả định này - chúng ta đã định nghĩa một

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 cho một lớp
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
7, lớp này có một thuộc tính được gọi là
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
8 thuộc loại
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
9

Lời nhắc nhở.

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 chỉ là một
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
1 chuyên dụng phù hợp với Mongo, đến lượt nó là một
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
2 chuyên biệt

Thay vì triển khai phương thức này trong một dịch vụ đang triển khai

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
3 - Spring Data JPA tạo một truy vấn tự động được cung cấp tên của phương thức. Nó sẽ tạo một truy vấn trả về danh sách tất cả các bản ghi
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
7, với một bản ghi phù hợp là
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
8

Khi phương thức được gọi với một số đầu vào, yêu cầu sau được thực hiện

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books

Ghi chú. Để xem kết quả này, bạn sẽ phải đặt mức sửa lỗi từ

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
6 thành
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
7

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

Đây là một tính năng cực kỳ linh hoạt và mạnh mẽ của Spring Data JPA và nó cho phép bạn khởi động các truy vấn mà không cần tự viết các truy vấn hoặc thậm chí triển khai bất kỳ logic xử lý nào trong back-end

Tuy nhiên, chúng trở nên rất khó tạo khi yêu cầu các truy vấn phức tạp.

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}

Và đây chỉ là hai tham số. Điều gì xảy ra khi bạn muốn tạo truy vấn cho 5 tham số?

Ngoài ra, bạn sẽ tạo bao nhiêu biến thể phương pháp?

Đây là điểm mà rất có thể bạn sẽ muốn viết các truy vấn của riêng mình. Điều này có thể thực hiện được thông qua chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8

Chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 được áp dụng ở cấp phương thức trong giao diện
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 và liên quan đến một phương thức duy nhất. Ngôn ngữ được sử dụng bên trong chú thích tùy thuộc vào back-end của bạn. Đương nhiên, đối với back-end Mongo, bạn sẽ viết các truy vấn Mongo gốc, tuy nhiên,
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 cũng hỗ trợ cơ sở dữ liệu quan hệ và chấp nhận các truy vấn gốc cho chúng hoặc JPQL trung lập (Ngôn ngữ truy vấn liên tục Java) được dịch tự động sang các truy vấn gốc của

Khi phương thức chú thích được gọi - truy vấn từ bên trong chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 kích hoạt và trả về kết quả

Ghi chú. Hướng dẫn này sẽ đề cập đến Spring Data JPA cùng với cơ sở dữ liệu Mongo và sẽ sử dụng các truy vấn áp dụng cho MongoDB

Nếu bạn muốn đọc thêm về cách viết truy vấn quan hệ/SQL, hãy đọc Spring Data JPA - Guide to the @Query Annotation của chúng tôi

Mô hình miền và kho lưu trữ

Hãy nhanh chóng xác định một mô hình

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
7 mà chúng ta sẽ sử dụng như một
public interface BookRepository extends MongoRepository {
}
4 cho kho lưu trữ của mình. Để thể hiện đúng các hoạt động khác nhau, chẳng hạn như sử dụng các toán tử
public interface BookRepository extends MongoRepository {
}
5 và
public interface BookRepository extends MongoRepository {
}
6 của Mongo, - chúng tôi sẽ có một vài thuộc tính khác nhau

MongoDB xử lý các ID loại

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
9 hoặc
public interface BookRepository extends MongoRepository {
}
8. Tùy thuộc vào bạn chọn cái nào bạn sẽ sử dụng - và
public interface BookRepository extends MongoRepository {
}
8 có thể dễ dàng được chuyển đổi thành Chuỗi và ngược lại nên không tạo ra nhiều khác biệt

Trong mọi trường hợp, hãy xác định một

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
3 đơn giản cho mô hình này

public interface BookRepository extends MongoRepository {
}

Nó hiện đang trống, nhưng nó chỉ hoạt động tốt cho các hoạt động CRUD, vì thực tế là

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 là hậu duệ của giao diện
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
2. Ngoài ra, phân trang và sắp xếp được hỗ trợ ngay lập tức

Trong các phần sắp tới, chúng ta sẽ xem xét chính chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8, cũng như cấu trúc truy vấn của MongoDB, cách tham chiếu các tham số của phương thức cũng như sắp xếp và sắp xếp trang.

Hiểu chú thích @Query

Chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 khá đơn giản và dễ hiểu

@Query("mongo query")
public List findBy(String param1, String param2);

Khi phương thức

@Query("mongo query")
public List findBy(String param1, String param2);
5 được gọi, kết quả sẽ được trả về. Hãy nhớ rằng trong thời gian biên dịch, Spring Boot không biết trước loại truy vấn sẽ trả về. Chẳng hạn, nếu nó trả về nhiều kết quả và bạn chỉ có một giá trị trả về dự kiến ​​duy nhất - một ngoại lệ sẽ được đưa ra trong thời gian chạy

Tùy thuộc vào bạn để đảm bảo rằng phản hồi của truy vấn khớp với kiểu trả về của phương thức

Bạn có thể có các truy vấn cố định hoặc động tại đây. Chẳng hạn, bạn có thể đơn giản hóa tên phương thức từ trước và ủy thác các tham số lộn xộn cho chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8

@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);

Trong ví dụ đầu tiên, chúng tôi có một bộ tham số cố định, chẳng hạn như luôn tìm kiếm sách đang hoạt động ngay cả khi khách hàng không chỉ định điều đó. Đây là một lợi thế so với các phương thức truy vấn dẫn xuất vì tên phương thức rõ ràng. Ngoài ra, bạn có thể cung cấp tham số cho các phương thức mà sau đó có thể được đưa vào chính chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8

@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);

Đối với những người có thể chưa hoàn toàn quen thuộc với cấu trúc truy vấn của MongoDB, hãy tìm hiểu sơ qua về những cấu trúc đó trước khi đi sâu vào trích xuất các tham số phương thức và sử dụng chúng trong các truy vấn

Cấu trúc truy vấn MongoDB

Tuy nhiên, MongoDB có cấu trúc truy vấn khá đơn giản, khác với cấu trúc SQL. Nếu bạn chưa sử dụng MongoDB nhiều và nếu bạn đã quen với cơ sở dữ liệu quan hệ, bạn nên làm mới bộ nhớ của mình trên các cấu trúc này

Tất cả các truy vấn Mongodb diễn ra giữa các dấu ngoặc nhọn

{query}

Điều kiện bình đẳng tiêu chuẩn tuân theo một mẫu đơn giản

{ 
 : , 
 : , 
.. 
}

Chẳng hạn, chúng ta có thể truy vấn sách của mình dưới dạng

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
0

Truy vấn này kiểm tra tất cả các tài liệu

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
7 trong bộ sưu tập, phù hợp với cả
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
8 và
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
0Number`. Ngoài ra, bạn có thể thêm các toán tử vào hỗn hợp tại đây

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
1

Truy vấn này kiểm tra xem

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
8 có phải là bất kỳ giá trị nào được cung cấp hay không. Một số toán tử được hỗ trợ là
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
2,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
3,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
4,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
5,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
6,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
7,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
8,
@Query("query with param1, param2, param3")
List findAllActive();

@Query("query with param1, param2, param3")
List findBy(param1, param2, param3);
9 và
@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
0, mặc dù có khá nhiều toán tử và bạn nên tìm hiểu về chúng. Ví dụ: đây là truy vấn tìm kiếm tất cả tài liệu của bất kỳ tác giả nào trong số hai tác giả, với số trang từ 400 đến 500, không được phát hành vào năm 2018 và 2019

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
2

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

Đây là phần lớn kiến ​​thức về truy vấn mà bạn sẽ cần cho rất nhiều truy vấn, nhưng đừng bỏ qua việc thực sự tìm hiểu về MongoDB trước khi nghiêm túc làm việc với nó. Ngoài ra, bạn cũng có thể muốn làm việc với các tập hợp

Nếu bạn muốn đọc thêm về các tập hợp với MongoDB - hãy đọc Dữ liệu mùa xuân MongoDB của chúng tôi - Hướng dẫn về chú thích @Aggregation

Tham chiếu các tham số phương thức được đặt tên và vị trí

Với kiến ​​thức chức năng MongoDB trong vành đai của chúng tôi - hãy xem cách chúng tôi có thể tham chiếu các tham số phương thức. Bạn có thể tham khảo chúng thông qua tên của chúng, kết hợp với chú thích

@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
1 và biểu thức SpEL, dài dòng hơn nhưng linh hoạt hơn hoặc thông qua các đối số vị trí, đây thường là cách tiếp cận được ưa thích do tính đơn giản

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
3

Trong cách tiếp cận đầu tiên, đối số vị trí đầu tiên,

@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
2, tương ứng với đối số đầu tiên trong phương thức và giá trị của đối số sẽ được sử dụng thay vì
@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
2. Điều này có nghĩa là bạn phải theo dõi các vị trí và không trộn lẫn chúng, nếu không, MongoDB sẽ âm thầm thất bại và không trả về kết quả, do tính linh hoạt của lược đồ, vì bạn cũng có thể có thuộc tính đó

Mẹo. Nếu bạn đã bật

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
7 làm cấp độ ghi nhật ký của mình - bạn sẽ có thể xem truy vấn được gửi tới Mongo trong nhật ký. Bạn có thể sao chép-dán truy vấn đó vào MongoDB Atlas để kiểm tra xem truy vấn có trả về kết quả chính xác ở đó hay không và xác minh xem bạn có vô tình làm sai vị trí hay không. Rất có thể - truy vấn của bạn vẫn ổn, nhưng bạn vừa trộn các vị trí nên kết quả là trống

Trong cách tiếp cận thứ hai, chúng tôi đang sử dụng các biểu thức SpEL để khớp các tham số được cung cấp với các tham số

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8. Bạn không cần phải xác định chúng theo bất kỳ thứ tự cụ thể nào vì chúng sẽ được khớp theo tên - không phải theo vị trí. Mặc dù vậy, vẫn nên giữ một vị trí thống nhất cho khả năng đọc API

Hãy xác định một điểm cuối đơn giản trong bộ điều khiển REST để kiểm tra phương thức này

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
4

Sau khi thiết lập, hãy gửi yêu cầu

@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
6 (hoặc điều hướng đến URL này qua trình duyệt)

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
5

Ghi chú. Để có câu trả lời rõ ràng, hãy nhớ chuyển

@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
7 của Jackson thành
@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
8 trong
@Query("{'active':true}")
List findAll();

@Query("{'author' : ?0, 'category' : ?1}")
List findPositionalParameters(String author, String category);

@Query("{'author' : :#{#author}, 'category' : :#{#category}}")
List findNamedParameters(@Param("author") String author, @Param("category") String category);
9 của bạn

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
6

Phân trang kết quả với Page và Pageable

Sắp xếp và phân trang được hỗ trợ ngay lập tức, vì

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 mở rộng
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
1. Như thường lệ, quy trình sẽ trả về một loại
{query}
2 và cung cấp một
{query}
3 cho chính phương thức đó

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
7

Khi gọi phương thức, bạn cần cung cấp đối tượng

{query}
3 hợp lệ, đối tượng này có thể được tạo bằng cách thực hiện yêu cầu trang

Ở đây, chúng tôi đang tạo một

{query}
5 cho trang đầu tiên (lập chỉ mục dựa trên 0) với kích thước của tài liệu
{query}
6. Nếu có 10 tài liệu phù hợp trong cơ sở dữ liệu, 5 trang sẽ được trả về, từ
{query}
7. Bạn phải tạo

Hãy in ra toàn bộ đối tượng

{query}
2 đã quay lại, trong đó
{query}
9 chứa kết quả của truy vấn và một số thuộc tính khác cũng có liên quan đến trang. Đây là nơi bạn có thể xem kết quả được sắp xếp như thế nào trong trang - i. e. sắp xếp, kích thước trang, số trang, v.v.

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
8

Nếu bạn chỉ muốn hiển thị kết quả, bạn có thể truy cập

{ 
 : , 
 : , 
.. 
}
0 dữ liệu và
{ 
 : , 
 : , 
.. 
}
1 nó vào danh sách

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
9

Để mở rộng chức năng này với tính năng sắp xếp, tất cả những gì bạn phải làm là cung cấp một đối tượng

{ 
 : , 
 : , 
.. 
}
2 cho
{query}
5, cho biết bạn muốn sắp xếp theo thuộc tính nào và theo thứ tự nào

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

Ở đây, chúng tôi đã sắp xếp kết quả theo tên tăng dần và số trang tăng dần. Khi sắp xếp qua nhiều thuộc tính, bạn có thể xâu chuỗi bất kỳ số lượng thuộc tính nào thông qua

{ 
 : , 
 : , 
.. 
}
4 và cung cấp một
{ 
 : , 
 : , 
.. 
}
5 khác

Phương thức

{ 
 : , 
 : , 
.. 
}
6 là một phương thức mặc định có trong giao diện
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
6 và chấp nhận cả hai phiên bản
{ 
 : , 
 : , 
.. 
}
2 và
{query}
3 và cũng có thể chạy mà không có chúng. Ở đây, chúng tôi đã tận dụng điều đó để truy vấn bằng cách sử dụng
{query}
3 mới

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

Thuộc tính đầu tiên được ưu tiên ở đây. Mặc dù cuốn sách thứ hai có ít trang hơn cuốn đầu tiên và chúng tôi đã sắp xếp theo số trang tăng dần, việc sắp xếp theo tên sẽ cho kết quả theo thứ tự này. Nếu thứ tự theo tên không rõ ràng, thuộc tính thứ hai sẽ bị cắt

Truy vấn với người vận hành

Tất cả những gì đang được nói, hãy tạo lại truy vấn từ đầu bài viết

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
2

Việc này dễ dàng như sao chép truy vấn này vào chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8. Biết rằng chúng ta có ba cuốn sách, cuốn đó dài 652 trang và một trong số đó đã được xuất bản vào năm 2019 - chúng ta chỉ nên mong đợi một cuốn sách duy nhất được trả lại ở đây - "Vũ trụ toán học của chúng ta" của Max Tegmark

Hãy kiểm tra xem điều đó có đúng không

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

Hoặc, để thực hiện sạch hơn

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

Ghi chú. Khi cung cấp các mảng dữ liệu, chẳng hạn như

find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
02 và
find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
03 - không cần xác định tham số là mảng trong truy vấn -
find using query: 
{ "author" : "Max Tegmark"} 
fields: Document{{}} 
for class: 
class com.example.demo.Book in collection: books
04. Điều này sẽ tạo ra một mảng trong một mảng. Chú thích
public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 sẽ tự động chuyển đổi đầu vào của bạn thành truy vấn phù hợp

Hãy cập nhật điểm cuối và cung cấp một số dữ liệu

Và khi chúng tôi gửi yêu cầu đến nó

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

Giống như đồng hồ

Phần kết luận

Trong hướng dẫn này, chúng ta đã xem xét chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 trong ngữ cảnh Spring Data MongoDB

Chú thích cho phép bạn xác định các truy vấn của riêng mình, gốc và JPQL, cho các cơ sở dữ liệu khác nhau, quan hệ và không quan hệ. Chúng tôi đã chọn sử dụng truy vấn gốc Mongo để tương tác với cơ sở dữ liệu không liên quan. Sau khi xác định một mô hình và một kho lưu trữ cho nó, chúng ta đã khám phá cấu trúc truy vấn được MongoDB sử dụng và cách thức hoạt động của chú thích

public interface PropertyRepository extends MongoRepository {
   List findPropertiesByTransactionTypeAndPropertyType(@Param("transaction_type") TransactionType transactionType, @Param("property_type") PropertyType propertyType);
}
8 nói chung. Tiếp theo là tham khảo các tham số phương thức được đặt tên và vị trí, phân trang và sắp xếp kết quả truy vấn, cũng như cách sử dụng các toán tử MongoDB để xây dựng các truy vấn phức tạp hơn

Có thể sử dụng JPA với cơ sở dữ liệu NoSQL không?

Hibernate OGM cung cấp hỗ trợ Java Persistence API (JPA) cho kho dữ liệu NoSQL . NoSQL là một thuật ngữ chung bao gồm nhiều loại lưu trữ dữ liệu. Ví dụ: điều này bao gồm kho dữ liệu khóa-giá trị, tài liệu, hướng cột và hướng biểu đồ.

MongoDB có thể được sử dụng với khởi động mùa xuân không?

Dễ dàng kết nối MongoDB Atlas với Spring Boot . Dữ liệu ban đầu MongoDB artifactid (phần phụ thuộc mà chúng tôi đã thêm khi tạo dự án Spring Initializr) trong pom. xml. Một tài sản trên ứng dụng.

Có thể sử dụng Hibernate với MongoDB không?

Làm cách nào để sử dụng Hibernate OGM với MongoDB? . Để đưa OGM vào dự án Hibernate MongoDB của bạn, chỉ cần đưa thêm một phụ thuộc vào danh sách phụ thuộc của bạn. Tiếp theo, để xác định đơn vị kiên trì, hãy tạo META-INF/persistence. To get started with Hibernate MongoDB, you first need to build the OGM from Source via GitBug. To include OGM in your Hibernate MongoDB project, just include one more dependency in your list of dependencies. Next, to define the persistence unit, create a META-INF/persistence.

MongoDB không phù hợp để làm gì?

Một trong những nhược điểm của MongoDB là không hỗ trợ giao dịch . Mặc dù ngày càng có ít ứng dụng yêu cầu giao dịch nhưng vẫn có một số ứng dụng cần giao dịch để cập nhật nhiều tài liệu/bộ sưu tập. Nếu đó là chức năng cần thiết cho nhóm của bạn thì không nên sử dụng MongoDB.