Hướng dẫn toán tử trong mongodb

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"url": "http://www.tutorialspoint.com",

"tags": ["mongodb", "database", "NoSQL"],

Ở 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 embededd/nested. 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 document (array in document) bao gồm mảng các thuộc tính đơn.

Data Examples

Với data model Post ví dụ ở các bài viết trước, tôi bổ sung thêm trường để ví dụ được đầ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 data lưu vào database:

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

Query an Array

1. $all

Để truy vấn với đ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 kiếm document 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ụ câu lệnh dưới đây document phải thỏa mã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í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 không đúng thứ tự thì đều không thỏa mã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 kết hợp nhiều điều kiện áp dụng cho mảng, bạn có thể chỉ định truy vấn với 2 cách:

  • Sự kết hợp của các phần tử trong mảng đáp ứng các điều kiện.
  • Một phần tử trong mảng thỏa mãn tất cả điều kiện

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

Ví dụ truy vấn các document 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.

OUTPUT:
--- Document trong Collection Post voi And Filter{filters=[Operator Filter{fieldName='numbers', operator='$gt', value=15}, Operator Filter{fieldName='numbers', operator='$lt', value=25}]}---
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=91f889b6-b6ad-4676-865e-b73727b2e6a6, title=Spring Java, user=Hungcdev, content=null, tags=[spring, java], numbers=[20, 30], postQuality=null, view=0, enable=false)
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 ---

Một phần tử trong mảng thỏa mãn tất cả điều kiện

Truy vấn mảng với việc ít nhất một phần tử trong mảng đáp ứng tất cả điều kiện - 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()
    );
}
6. Ví dụ truy vấn các document 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 thỏa mãn lớn hơn 15 và nhỏ hơn 25

OUTPUT:
--- Document trong Collection Post voi com.mongodb.client.model.Filters$1@662b4c69---
Post(id=91f889b6-b6ad-4676-865e-b73727b2e6a6, title=Spring Java, user=Hungcdev, content=null, tags=[spring, java], numbers=[20, 30], postQuality=null, view=0, enable=false)
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 ---

4. Index Array

Để truy vấn với điều kiện 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 các document 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:

OUTPUT:
--- Document trong Collection Post voi Filter{fieldName='numbers.1', value=40}---
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)
--- End ---

5. $size

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 các document mà có mảng có 3 phần tử: