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.

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.

Kết quả chạy docker-compose up
Kết quả chạy docker-compose up

 

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.

Kết quả chạy chương trình