Thao tác với MongoDB trong các ứng dụng Java

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

MongoDB là một NoSQL database, cho phép chúng ta có thể lưu trữ những kiểu dữ liệu phức tạp, không có cấu trúc nhất định. Trong bài viết này, mình sẽ hướng dẫn các bạn các bước cơ bản để làm việc với MongoDB trong các ứng dụng Java các bạn nhé!

  MongoDB là gì? Cơ sở dữ liệu phi quan hệ
  MongoDB là gì? Định nghĩa đầy đủ và chi tiết nhất về MongoDB

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

MongoDB
Maven project

Tương tự như các hệ thống database khác, để làm việc với Java, chúng ta cần khai báo để sử dụng Driver của MongoDB trong ứng dụng của mình.

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.7.0</version>
</dependency>

OK, bắt đầu thôi các bạn.

Để kết nối tới MongoDB, chúng ta sẽ sử dụng đối tượng MongoClient từ thư viện Driver của nó với khai báo như sau:

MongoClientURI uri = new MongoClientURI("mongodb://localhost:27017");
MongoClient client = new MongoClient(uri);

Trong đó đối tượng MongoClientURI là một trong những đối tượng sẽ quản lý thông tin về MongoDB bao gồm IP address và port mà MongoDB đang chạy. Còn đối tượng MongoClient sẽ là đối tượng đảm nhiệm vai trò kết nối tới MongoDB đó.

Trong trường hợp, các bạn đang sử dụng MongoDB server với authentication mode, thì các bạn cần khai báo username và password đang được gán cho database mà các bạn đang định sẽ sử dụng, các bạn nhé.

MongoCredential credential = MongoCredential.createCredential("khanh", "mongodb", "abc123".toCharArray());
List<MongoCredential> auths = new ArrayList<MongoCredential>();
auths.add(credential);

Sau đó thì kết nối tới MongoDB với đoạn code sau:

ServerAddress serverAddress = new ServerAddress("localhost", 27017);
MongoClient client = new MongoClient(serverAddress, auths);

Mình sẽ sử dụng MongoDB server không chạy với authentication mode trong bài viết này, các bạn nhé!

Mặc định, MongoDB sẽ chạy trên port 27017 và nếu các bạn đang cài đặt MongoDB trên máy local thì chúng ta không cần phải khai báo đối tượng MongoClientURI các bạn nhé! Các bạn chỉ cần khai báo đơn giản như sau:

MongoClient client = new MongoClient();

Mình đang sử dụng MongoDB trên máy mình nên mình chỉ cần khai báo như trên mà thôi!

Lúc này, nếu chạy ứng dụng:

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();
    }
}

các bạn sẽ thấy kết quả như sau:

MongoDB
Kết quả hiển thị

Nhìn vào đoạn log, các bạn có thể thấy là ứng dụng của chúng ta đã kết nối được với MongoDB rồi đó các bạn!

Sau khi đã kết nối tới MongoDB xong, giờ thì các bạn có thể thao tác với nó.

Đầu tiên, các bạn có thể lấy được danh sách các database đang có trong MongoDB hiện tại của mình sử dụng phương thức listDatabaseNames().

Ví dụ:

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoIterable;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoIterable<String> databaseNames = client.listDatabaseNames();
        MongoCursor<String> iterator = databaseNames.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

Kết quả:

MongoDB
Kết quả

Chúng ta có thể chọn database để thao tác sử dụng phương thức getDatabase() của đối tượng MongoClient.

Ví dụ, mình đang có một database tên là mongodb trong MongoDB, thì code của mình sẽ như sau:

MongoDatabase mongodb = client.getDatabase("mongodb");

Giống như khi thao tác sử dụng command line với MongoDB, nếu database mà chúng ta chọn để thao tác không tồn tại thì database này sẽ tự động tạo nha các bạn.

Đối tượng MongoDatabase sẽ là đối tượng nắm giữ mọi thông tin về các Collection có trong database mà chúng ta đang sử dụng. Do đó, từ đối tượng MongoDatabase này, các bạn có thể lấy được tên của tất cả các Collection sử dụng phương thức listCollectionNames().

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoDatabase mongodb = client.getDatabase("mongodb");

        MongoIterable<String> collectionNames = mongodb.listCollectionNames();
        MongoCursor<String> iterator = collectionNames.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

Database “mongodb” của mình đang có những Collection sau:

MongoDB
Có những Collection sau

thì kết quả sẽ là:

MongoDB
Kết quả

Để thao tác với một Collection nào đó, các bạn có thể sử dụng phương thức getCollection() của đối tượng MongoDatabase để lấy đối tượng MongoCollection cho Collection đó.

Ví dụ của mình như sau:

MongoCollection<Document> student = mongodb.getCollection("student");

Nếu muốn insert một Document vào Collection thì các bạn có thể sử dụng các phương thức insertOne() để insert 1 Document hoặc insertMany() để insert nhiều Document cùng một lúc.

Một Document là một chuỗi JSON và chúng ta sẽ sử dụng đối tượng Document của MongoDB Driver API để build nó. Ví dụ, giờ mình muốn build một Document về thông tin sinh viên gồm tên và tuổi thì mình sẽ tạo đối tượng Document như sau:

package com.huongdanjava.mongodb;

import org.bson.Document;

public class Student extends Document {

    private static final String NAME = "name";
    private static final String AGE = "age";
    public static final String COLLECTION_NAME = "student";

    public String getName() {
        return getString(NAME);
    }

    public void setName(String name) {
        put(NAME, name);
    }

    public Integer getAge() {
        return getInteger(AGE);
    }

    public void setAge(Integer age) {
        put(AGE, age);
    }
}

rồi viết code để insert một Document mới:

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoDatabase mongodb = client.getDatabase("mongodb");

        MongoCollection<Document> studentCollection = mongodb.getCollection(Student.COLLECTION_NAME);

        Student student = new Student();
        student.setName("Khanh");
        student.setAge(31);

        studentCollection.insertOne(student);
    }
}

Kết quả:

MongoDB
Kết quả

Tất nhiên, các bạn cũng có thể kiểm tra kết quả từ code bằng cách sử dụng phương thức find() của đối tượng MongoCollection.

Phương thức find() này có tham số là một đối tượng Document, đây chính là tiêu chí để tìm kiếm tất cả các Document trong Collection hiện tại có nội dung tương tự đó các bạn.

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoDatabase mongodb = client.getDatabase("mongodb");

        MongoCollection<Document> studentCollection = mongodb.getCollection(Student.COLLECTION_NAME);

        Student student = new Student();
        student.setName("Khanh");
        student.setAge(31);

        FindIterable<Document> documents = studentCollection.find(student);
        MongoCursor<Document> iterator = documents.iterator();
        while (iterator.hasNext()) {
            Document next = iterator.next();
            System.out.println(next);
        }
    }
}

Trong ví dụ trên, mình tìm kiếm các Student Document theo 2 tiêu chí là name và age. Các bạn có thể mở rộng kết quả tìm kiếm bằng một trong 2 tiêu chí này cũng được.

Kết quả:

MongoDB
Kết quả

Các bạn cũng có thể update một hoặc nhiều Document cùng một lúc cũng được.

Chúng ta sẽ sử dụng các phương thức updateOne() hoặc updateMany() của đối tượng MongoCollection để làm điều này.

Có nhiều phương thức overload của 2 phương thức trên với các tham số khác nhau. Nhưng cơ bản thì có 2 tham số chính, đó là đối tượng Document để tìm kiếm các Document cần update, đối tượng Document thứ 2 chứa nội dung cần update.

Trong ví dụ của mình, giả sử mình cần update tuổi của các sinh viên tên Khanh lên 32 thì mình sẽ viết code như sau:

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.*;
import org.bson.Document;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoDatabase mongodb = client.getDatabase("mongodb");

        MongoCollection<Document> studentCollection = mongodb.getCollection(Student.COLLECTION_NAME);

        Student studentFilter = new Student();
        studentFilter.setName("Khanh");

        Student student = new Student();
        student.setAge(32);
        Document updateObject = new Document();
        updateObject.put("$set", student);

        studentCollection.updateOne(studentFilter, updateObject);
    }
}

Như các bạn thấy, đối tượng Document chứa nội dung cần update cần được build với từ khoá “$set” và value của nó là thông tin sinh viên cần update.

Kết quả:

MongoDB
Kết quả

Và các bạn cũng có thể xoá một hoặc nhiều Document cùng một lúc sử dụng các phương thức deleteOne() và deleteMany().

Ví dụ:

package com.huongdanjava.mongodb;

import com.mongodb.MongoClient;
import com.mongodb.client.*;
import com.mongodb.client.result.DeleteResult;
import org.bson.Document;

public class Application {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();

        MongoDatabase mongodb = client.getDatabase("mongodb");

        MongoCollection<Document> studentCollection = mongodb.getCollection(Student.COLLECTION_NAME);

        Student student = new Student();
        student.setName("Khanh");

        DeleteResult deleteResult = studentCollection.deleteOne(student);
        System.out.println(deleteResult.getDeletedCount());
    }
}

Kết quả:

MongoDB
Kết quả
Bài viết gốc được đăng tải tại huongdanjava.com
Có thể bạn quan tâm:
Xem thêm các việc làm Developer hấp dẫn tại TopDev