MongoDB là một cơ sở dữ liệu mã nguồn mở, được thiết kế theo kiểu hướng đối tượng, cho phép lưu trữ dữ liệu với cấu trúc linh hoạt. Nhờ vậy, MongoDB là một trong những lựa chọn hàng đầu được hàng triệu lập trình viên sử dụng. Trong bài viết này, tôi sẽ trình bày các thao tác cơ bản với MongoDB trong Go. Cụ thể, tôi sẽ viết một chương trình đơn giản thực hiện những tác vụ sau:
- Kết nối với MongoDB
- Thêm dữ liệu
- Đọc dữ liệu và in ra màn hình
Mã nguồn đầy đủ các bạn có thể tham khảo tại đây. Hy vọng những chỉ dẫn cơ bản của tôi có thể giúp ích cho các bạn có mong muốn làm việc với MongoDB và Go.
Cài đặt MongoDB
Trước khi bắt đầu, cần đảm bảo rằng các bạn đã cài Go và MongoDB.
- Hướng dẫn cài đặt Go: https://golang.org/doc/install
- Hướng dẫn cài đặt MongoDB: https://docs.mongodb.com/manual/installation/ . Ngoài ra, các bạn có thể cài đặt MongoDB bằng Docker compose. Rất nhanh gọn, dễ cấu hình và có thể tái sử dụng.
version: '3'
services:
mongodb:
image: mongo:latest
container_name: "mongodb"
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: 1234
MONGO_INITDB_DATABASE: test_db
ports:
- "27017:27017"
volumes:
- ./initMongo/:/docker-entrypoint-initdb.d/
Tôi cài đặt MongoDB phiên bản mới nhất bằng cách khai báo service “mongodb” sử dụng image “mongo:latest”. Tôi kết nối cổng 27017 trên container với cổng 27017 của máy tôi. Các bạn có thể sử dụng cổng khác tùy ý. Ở đây tôi khai báo hai biến môi trường. MONGO_INITDB_ROOT_USERNAME và MONGO_INITDB_ROOT_PASSWORD là tên đăng nhập và mật khẩu của tài khoản root. Do đã khai báo hai biến này nên mặc định khi khởi động, trình xác thực của MongoDB sẽ được kích hoạt: mongod --auth. Từ đó, để có thể truy cập và thực hiện tác vụ trên MongoDB bạn phải đăng nhập với tài khoản đã đăng kí. Trong chương trình phía sau, tôi sẽ thao tác với database có tên là “test_db”. Để tăng tính bảo mật, tôi sẽ không dùng tài khoản root. Tôi sẽ tạo ra một tài khoản chỉ có quyền đọc ghi vào database “test_db”. Khi container mongodb được khởi động lần đầu tiên, nó sẽ thực thi các tệp có phần mở rộng .sh và .js được tìm thấy trong thư mục /docker-entrypoint-initdb.d Các tệp .js sẽ được thực thi bởi mongo trên database được chỉ định biến MONGO_INITDB_DATABASE. Do vậy, tôi đã khai báo giá trị cho biến MONGO_INITDB_DATABASE là “test_db” đồng thời tạo file init.js. Sau đó volumes thư mục chứa file init.js trong máy tôi với thư mục /docker-entrypoint-initdb.d trong container.
db.createUser(
{
user: "user1",
pwd: "example",
roles: ["readWrite"]
}
);
db.createCollection("post");
Như vậy, việc khai báo cấu hình trong file docker-compose đã xong. Bước cuối cùng, các bạn chỉ cần di chuyển đến thư mục chứa file docker-compose và thực hiện lệnh build.
docker-compose up
Kết quả như các bạn thấy, MongoDB được cài đặt và sẵn sàng nhận kết nối từ cổng 27017.
Viết chương trình Go
Giờ chúng ta sẽ tiến hành viết một chương trình Go đơn giản để đọc ghi dữ liệu vào database “test_db” vừa tạo. Chúng ta sẽ sử dụng “mgo” - trình điều khiển MongoDB dành cho Golang.
Install mgo
go get gopkg.in/mgo.v2
go get gopkg.in/mgo.v2/bson
Mã nguồn chương trình
package main
import (
"log"
"time"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
const (
hosts = "localhost:27017"
database = "test_db"
username = "user1"
password = "example"
collection = "post"
)
type Post struct {
Tile string
Content string
}
func main() {
// Tạo phiên kết nối với MongDB
info := &mgo.DialInfo{
Addrs: []string{hosts},
Timeout: 60 * time.Second,
Database: database,
Username: username,
Password: password,
}
session, err := mgo.DialWithInfo(info)
if err != nil {
panic(err)
}
// Tạo collection
col := session.DB(database).C(collection)
// Ghi dữ liệu
err = col.Insert(&Post{"Hello World", "Đây là bài viết hướng dẫn thao tác với MongoDB trong Golang"},
&Post{"Thời tiết", "Hôm nay nắng đẹp quá!!!"})
if err != nil {
log.Fatal(err)
}
// Đọc dữ liệu
var posts []Post
err = col.Find(bson.M{}).All(&posts)
if err != nil {
log.Fatal(err)
}
for _, post := range posts {
log.Println(post)
}
}
Đầu tiên, tạo phiên kết nối tới MongDB dựa vào các thông tin host, username, password, database đã tạo trước đó. Nếu trước đó, các bạn bỏ qua không khai báo biến môi trường để khởi động trình xác thực của MongoDB thì có thể để trống thông tin tài khoản đăng nhập ở đây. Nếu có khai báo, thì hãy sử dụng chính xác tài khoản được cấp quyền nhé. Sau đó, chúng ta khai báo collection (tương đương với table trong SQL). Một cơ chế hoạt động rất hay trong MongoDB đó là “tạo ngay lần đầu tiên sử dụng”. Khi thêm một document vào collection, nếu collection đó chưa tồn tại trong hệ thống thì MongoDB sẽ tự động thêm mới và đồng thời insert dữ liệu luôn. Về chi tiết cách sử dụng các API của package mgo các bạn có thể tham khảo tại https://godoc.org/gopkg.in/mgo.v2. Về cơ bản, cú pháp của nó khá giống với khi bạn thao tác trên Mongo shell.
Và đây kết quả chạy chương trình.
Bình luận