MongoDB Java Tutorials - Hướng dẫn truy vấn dữ liệu trong MongoDB Sử dụng Java - Phần 1
Overview
Ở bài viết trước tôi đã Hướng dẫn thêm dữ liệu trong MongoDB. Tiếp tục bài viết này, tôi sẽ hướng dẫn truy vấn dữ liệu trong MongoDB Sử dụng Java.
Query Operators
MongoDB Java có 2 function chính để thao tác truy vấn:
- find(): tìm kiếm tất cả document trong Collection
- find(Bson query): tìm kiếm document với điều kiện truy vấn
Danh sách các toán tử so sánh sử dụng trong truy vấn:
$eq
(Equals): Thỏa mãn các giá trị bằng với một giá trị được chỉ định$gt
(Greater Than): Thỏa mãn các giá trị lớn hơn một giá trị được chỉ định$gte
(Greater Than or Equals): Thỏa mãn các giá trị lớn hơn hoặc bằng một giá trị được chỉ định$lt
(Less Than): Thỏa mãn các giá trị nhỏ hơn một giá trị được chỉ định$lte
(Less Than or Equals): Thỏa mãn các giá trị nhỏ hơn hoặc bằng một giá trị được chỉ định$in
(In): Thỏa mãn với bất kỳ giá trị nào được chỉ định trong một mảng$nin
(Not In): Thỏa mãn với không có giá trị nào được chỉ định trong một mảng
Danh sách các phép toán tử truy vấn logic:
$and
: Toán tử chỉ ra kết quả trả về là thỏa mãn tất cả các điều kiện truy vấn$or
: Toán tử chỉ ra kết quả trả về là thỏa mãn bất kỳ một trong các điều kiện truy vấn$not
: Toán tử chi ra việc đảo ngược truy vấn, kết quả trả về không thỏa mãn điều kiện truy vấn$nor
: Toán tử chi ra việc đảo ngược truy vấn, kết quả trả về không thỏa mãn tất cả điều kiện truy vấn
Query Document
Tôi xây dựng class gồm 2 Function:
- findAll(): Function để tìm kiếm tất cả document trong Collection
- find(Bson query): Function để tìm kiếm các document với điều kiện truy vấn
public class QueryDocument {
private MongoDatabase mongoDatabase;
public QueryDocument(String ip, int port, String databaseName) {
MongoClient mongoClient = MongoDBConnection.connectMongoDBWithPOJOs(ip, port);
this.mongoDatabase = mongoClient.getDatabase(databaseName);
}
/**
* The method to find all document in Collection
* @param collectionName
* @param classType
* @param <T>
* @return
*/
public <T> List<T> findAll(String collectionName, Class<T> classType) {
MongoCollection<T> collection = mongoDatabase.getCollection(collectionName, classType);
FindIterable<T> findResult = collection.find();
return convert(findResult);
}
/**
* The method to find document in Collection with condition
* @param collectionName
* @param classType
* @param query
* @param <T>
* @return
*/
public <T> List<T> find(String collectionName, Class<T> classType, Bson query) {
MongoCollection<T> collection = mongoDatabase.getCollection(collectionName, classType);
FindIterable<T> findResult = collection.find(query);
return convert(findResult);
}
/**
* The method to convert from FindIterable to List
* @param findIterable
* @param <T>
* @return
*/
private <T> List<T> convert(FindIterable<T> findIterable) {
List<T> documents = new ArrayList<>();
MongoCursor<T> cursor = findIterable.cursor();
while (cursor.hasNext())
documents.add(cursor.next());
return documents;
}
}
Examples
- Data Example - Xây dựng các document Post và thêm vào Database để lấy dữ liệu truy vấn
private static void initDataExample(String ip, int port , String databaseName, String collection) {
InsertDocument insertDocument = new InsertDocument(ip, port, databaseName);
insertDocument.insertMany(collection, Post.class,
Post.builder().id(UUID.randomUUID().toString()).title("Mongodb").user("Hungcdev").content("MongoDB Tutorial").view(100).enable(true).build(),
Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").content("Spring Tutorial").view(200).enable(false).build(),
Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").content("Java Tutorial").view(300).enable(true).build(),
Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").content("Spring Boot Tutorial").view(400).enable(true).build(),
Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").content("PHP Tutorial").view(500).enable(true).build()
);
}
- Find All - Tìm kiếm tất cả document trong collection
private static void findAllExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
List<Post> postList = queryDocument.findAll(collection, Post.class);
System.out.println("--- Document trong Collection Post ---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post ---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- Equals - Tìm kiếm các document trong colleciton với điều kiện so sánh Equals ($eq)
private static void findEqualsExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi id = 8cf90a70-d7cd-4b7b-995b-167daab3c059 */
// Bson query = Filters.eq("_id","8cf90a70-d7cd-4b7b-995b-167daab3c059");
/* tim kiem document voi user la Hungcdev */
// Bson query = Filters.eq("user","Hungcdev");
/* tim kiem document voi enable la true */
Bson query = Filters.eq("enable",true);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Filter{fieldName='enable', value=true}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- Not Equals - Tìm kiếm các document trong collection với điều kiện so sánh Not Equals ($ne)
private static void findNotEqualsExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi user khac gia tri Hungcdev */
Bson query = Filters.ne("user","Hungcdev");
/* tim kiem document voi enable khac gia tri true */
// Bson query = Filters.ne("enable",true);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='user', operator='$ne', value=Hungcdev}---
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- In - Tìm kiếm các document trong collection với điều kiện so sánh In ($in)
private static void findInExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi title nam trong danh sach {Mongodb, Spring, Java}*/
Bson query = Filters.in("title",List.of("Mongodb", "Spring", "Java"));
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='title', operator='$in', value=[Mongodb, Spring, Java]}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
--- End ---
- Not In - Tìm kiếm các document trong collection với điều kiện so sánh Not In ($nin)
private static void findNotInExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi title khong nam trong danh sach {Mongodb, Spring, Java}*/
Bson query = Filters.nin("title",List.of("Mongodb", "Spring", "Java"));
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='title', operator='$nin', value=[Mongodb, Spring, Java]}---
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- Greater Than - Tìm kiếm các document trong collection với điều kiện so sánh Greater Than ($gt)
private static void findGreaterThanExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view > 300 */
Bson query = Filters.gt("view", 300);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='view', operator='$gt', value=300}---
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- Greater Than or Equals - Tìm kiếm các document trong colleciont với điều kiện so sánh Greater Than or Equals ($gte)
private static void findGreaterThanOrEqualsExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view >= 300 */
Bson query = Filters.gte("view", 300);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='view', operator='$gte', value=300}---
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
Post(id=b62206a3-9ec4-41e3-be6f-8d15f3ec60b7, title=Spring Boot, user=AtomPtit, content=Spring Boot Tutorial, tags=null, postQuality=null, view=400, enable=true)
Post(id=0f83f9ff-c154-4f80-9e80-4b21cc44f51e, title=PHP, user=HungHoi, content=PHP Tutorial, tags=null, postQuality=null, view=500, enable=true)
--- End ---
- Less Than - Tìm kiếm các document trong collection với điều kiện so sánh Less Than ($lt)
private static void findLessThanExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view < 300 */
Bson query = Filters.lt("view", 300);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='view', operator='$lt', value=300}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
--- End ---
- Less Than or Equals - Tìm kiếm các document trong collection với điều kiện so sánh Less Than or Equals ($lte)
private static void findLessThanOrEqualsExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view <= 300 */
Bson query = Filters.lte("view", 300);
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='view', operator='$lte', value=300}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
--- End ---
- AND - Tìm kiếm các document trong collection thỏa mãn tất cả các điều kiện ($and)
private static void findANDLogicExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view >= 100 && view < 300 */
Bson query = Filters.and(Filters.gte("view", 100), Filters.lt("view", 300));
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi And Filter{filters=[Operator Filter{fieldName='view', operator='$gte', value=100}, Operator Filter{fieldName='view', operator='$lt', value=300}]}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
--- End ---
- OR - Tìm kiếm các document trong collection thỏa mãn bất kỳ một trong các điều kiện ($or)
private static void findORLogicExample(String ip, int port, String databaseName, String collection) {
QueryDocument queryDocument = new QueryDocument(ip, port,databaseName);
/* tim kiem document voi view >= 100 && view < 300 */
Bson query = Filters.or(Filters.eq("user", "Hungcdev"), Filters.in("title", List.of("Spring", "Java")));
List<Post> postList = queryDocument.find(collection, Post.class, query);
System.out.println("--- Document trong Collection Post voi "+ query.toString() + "---");
postList.forEach(post -> System.out.println(post.toString()));
System.out.println("--- End ---");
}
OUTPUT:
--- Document trong Collection Post voi Or Filter{filters=[Filter{fieldName='user', value=Hungcdev}, Operator Filter{fieldName='title', operator='$in', value=[Spring, Java]}]}---
Post(id=cba2a7aa-5f14-40ba-b014-ad40392e6cc2, title=Mongodb, user=Hungcdev, content=MongoDB Tutorial, tags=null, postQuality=null, view=100, enable=true)
Post(id=4f884ef3-da16-4ef4-bae6-9bdbb5e6d6d1, title=Spring, user=Hungcdev, content=Spring Tutorial, tags=null, postQuality=null, view=200, enable=false)
Post(id=f8c905a4-722c-4534-a0c8-5885cda09b17, title=Java, user=AtomPtit, content=Java Tutorial, tags=null, postQuality=null, view=300, enable=true)
--- End ---
Cuối cùng, một hàm main gọi tất cả các hàm đã xây dựng:
public static void main(String[] args) {
// Thong tin cau hinh de ket noi MongoDB
String IP = "localhost";
int port = 27017;
String databaseName = "HungcDev";
String collection = "Post";
/* Khoi tao du lieu */
initDataExample(IP, port, databaseName, collection);
/* Tim kiem tat ca document Post trong Collection */
findAllExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Equals */
findEqualsExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Not Equals */
findNotEqualsExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh In */
findInExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Not In */
findNotInExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Greater Than */
findGreaterThanExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Greater Than Or Equals */
findGreaterThanOrEqualsExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Less than */
findLessThanExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection voi dieu kien so sanh Less than or Equals */
findLessThanOrEqualsExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection thoa man tat ca cac dieu kien */
findANDLogicExample(IP, port, databaseName, collection);
/* Tim kiem document Post trong Collection thoa man bat ky mot trong cac dieu kien */
findORLogicExample(IP, port, databaseName, collection);
}
Source code
Source code liên quan về bài viết: https://github.com/hungcdev/MongoDB-Java-Tutorials