Truy vấn bộ lọc mongodb

Ở bài viết trước tôi đã hướng dẫn truy vấn dữ liệu trong MongoDB bao gồm Phần 1 về các trường cơ bản, Phần 2 về các trường nhúng/lồng nhau. 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 Phần 3. Phần này tôi sẽ hướng dẫn truy vấn dữ liệu trên mảng của tài liệu (mảng trong tài liệu) bao gồm các mảng thuộc tính đơn

Ví dụ dữ liệu

With data model

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
9 ví dụ ở các bài viết trước, tôi bổ sung thêm trường để ví dụ đầy đủ các trường hợp

@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Post {
    private String id;
    private String title;
    private String user;
    private String content;
    private List tags;
    private List numbers;
    private PostQuality postQuality;
    private int view;
    private boolean enable;
}

Xây dựng lưu trữ dữ liệu vào cơ sở dữ liệu

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}

Truy vấn một mảng

1. $tất cả

Để truy vấn điều kiện mảng chứa các phần tử, ta sử dụng

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
0. Ví dụ dưới đây tìm tài liệu tìm kiếm với điều kiện mảng
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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
1 có chứa các phần tử. mongodb, java

OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='tags', operator='$all', value=[mongodb, java]}---
Post(id=5f63c96a-8551-41bd-a5dc-80124d20de57, title=Mongodb, user=Hungcdev, content=null, tags=[mongodb, java], numbers=[10, 30], postQuality=null, view=100, enable=true)
Post(id=f4d10d34-3117-4081-b42d-c97c677f5b48, title=Java, user=AtomPtit, content=null, tags=[java, mongodb], numbers=[30, 40], postQuality=null, view=0, enable=true)
Post(id=5d239f26-5e6a-46a6-b241-b100b092a74a, title=Spring Boot, user=AtomPtit, content=null, tags=[spring, java, mongodb], numbers=[20, 30, 40], postQuality=null, view=0, enable=true)
--- End ---

2. $eq

Để truy vấn so sánh toàn bộ danh sách trong một mảng, chúng ta sử dụng toán tử

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
2. Ví dụ như câu lệnh bên dưới tài liệu này phải bổ sung mảng
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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
1 có chính xác 2 phân tử lần lượt là mongodb và java. Thiếu hoặc thừa bất kỳ phần tử nào hoặc sai thứ tự thì đều không đạt tiêu chuẩn

OUTPUT:
--- Document trong Collection Post voi Filter{fieldName='tags', value=[mongodb, java]}---
Post(id=5f63c96a-8551-41bd-a5dc-80124d20de57, title=Mongodb, user=Hungcdev, content=null, tags=[mongodb, java], numbers=[10, 30], postQuality=null, view=100, enable=true)
--- End --

Để tìm kiếm với điều kiện mảng chứa phần tử với giá trị được chỉ định, ta cũng sử dụng

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
2

OUTPUT:
--- Document trong Collection Post voi Filter{fieldName='tags', value=mongodb}---
Post(id=5f63c96a-8551-41bd-a5dc-80124d20de57, title=Mongodb, user=Hungcdev, content=null, tags=[mongodb, java], numbers=[10, 30], postQuality=null, view=100, enable=true)
Post(id=f4d10d34-3117-4081-b42d-c97c677f5b48, title=Java, user=AtomPtit, content=null, tags=[java, mongodb], numbers=[30, 40], postQuality=null, view=0, enable=true)
Post(id=5d239f26-5e6a-46a6-b241-b100b092a74a, title=Spring Boot, user=AtomPtit, content=null, tags=[spring, java, mongodb], numbers=[20, 30, 40], postQuality=null, view=0, enable=true)
--- End ---

3. $elemMatch

Khi chỉ định nhiều điều kiện áp dụng cho mảng, bạn có thể chỉ truy vấn theo 2 cách

  • Sự kết hợp của các phần tử trong mảng trả lời các điều kiện
  • An Element section in an array

Sự kết hợp của các phần tử trong mảng trả lời các điều kiện

Ví dụ truy vấn các tài liệu với điều kiện các phần từ trong mảng

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
5 có phần tử lơn hơn 15, có phần nhỏ hơn 25

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
1

An Element section in an array

Truy vấn mảng với ít nhất một phần tử trong mảng trả lời tất cả các điều kiện - sử dụng toán điện tử

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
6. Ví dụ truy vấn các tài liệu với điều kiện ít nhất một phần tử trong mảng
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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
5 phải tôn trọng độ tuổi lớn hơn 15 và nhỏ hơn 25

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
4

4. Mảng chỉ mục

Để truy vấn điều kiện của một phần tử trong mảng với vị trí cụ thể, bạn sử dụng ký tự

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
8 sau đó là vị trí của phần tử (vị trí bắt đầu từ 0)

Ví dụ truy vấn tài liệu với phần tử thứ 2 trong mảng

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
5 bằng 40

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").postQuality(new PostQuality(120, 50)).view(100).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring").user("Hungcdev").postQuality(new PostQuality(120, 100)).view(200).enable(false).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Java").user("AtomPtit").postQuality(new PostQuality(50, 10)).view(300).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("Spring Boot").user("AtomPtit").postQuality(new PostQuality(70, 50)).view(400).enable(true).build(),
            Post.builder().id(UUID.randomUUID().toString()).title("PHP").user("HungHoi").postQuality(new PostQuality(150, 120)).view(500).enable(true).build()
    );
}
7

5. kích thước $

Sử dụng

OUTPUT:
--- Document trong Collection Post voi Operator Filter{fieldName='tags', operator='$all', value=[mongodb, java]}---
Post(id=5f63c96a-8551-41bd-a5dc-80124d20de57, title=Mongodb, user=Hungcdev, content=null, tags=[mongodb, java], numbers=[10, 30], postQuality=null, view=100, enable=true)
Post(id=f4d10d34-3117-4081-b42d-c97c677f5b48, title=Java, user=AtomPtit, content=null, tags=[java, mongodb], numbers=[30, 40], postQuality=null, view=0, enable=true)
Post(id=5d239f26-5e6a-46a6-b241-b100b092a74a, title=Spring Boot, user=AtomPtit, content=null, tags=[spring, java, mongodb], numbers=[20, 30, 40], postQuality=null, view=0, enable=true)
--- End ---
0 để truy vấn số lượng phần tử trong mảng, ví dụ chọn tài liệu mà mảng có 3 phần tử