Hướng dẫn này giới thiệu về các hoạt động cơ bản của MongoDB từ góc nhìn của ngôn ngữ Golang.

Lưu ý: Hướng dẫn này sử dụng gói trình điều khiển ngôn ngữ Go chính thức do MongoDB cung cấp.

Các hướng dẫn yêu cầu

Xem thêm hướng dẫn MongoDB

Lưu ý: Nếu bạn chưa quen với MongoDB, hãy nghiên cứu kiến thức về MongoDB trước. Hướng dẫn về Golang sẽ không lặp lại kiến thức liên quan.

Yêu cầu cơ bản

  • Go 1.10 hoặc cao hơn
  • MongoDB 2.6 hoặc cao hơn

Cài đặt các phụ thuộc

go get go.mongodb.org/mongo-driver/mongo

Kết nối tới MongoDB

import (
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

// Địa chỉ kết nối tới MongoDB
uri := "mongodb://localhost:27017"
// Lấy đối tượng ngữ cảnh, bạn có thể thiết lập một thời gian chờ đợi
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// Kết nối tới MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

Hàm Connect không chặn luồng goroutine. Có nghĩa là, việc vận hành trực tiếp MongoDB sau khi gọi phương thức Connect có thể dẫn đến lỗi vì MongoDB chưa kết nối thành công. Bạn có thể sử dụng phương thức Ping để kiểm tra xem MongoDB đã kết nối thành công hay chưa.

// Ping tới MongoDB, nếu kết nối thành công, không trả về lỗi
err = client.Ping(ctx, readpref.Primary())

Địa chỉ kết nối tới MongoDB

Địa chỉ kết nối tới MongoDB bao gồm thông tin quan trọng như địa chỉ máy chủ, số cổng, tài khoản và mật khẩu. Định dạng như sau:

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

Ví dụ:

// Kết nối tới địa chỉ localhost:27017 với tên người dùng và mật khẩu mặc định
mongodb://localhost:27017

// Kết nối tới địa chỉ localhost:27017 với tài khoản=root, mật khẩu=123456, và kết nối tới cơ sở dữ liệu mặc định=admin
mongodb://root:123456@localhost:27017/admin

Giải phóng tài nguyên kết nối

Nếu không cần thiết, bạn cần phải giải phóng thủ công các tài nguyên kết nối.

defer func() {
    if err = client.Disconnect(ctx); err != nil {
        panic(err)
    }
}()

Lấy Đối tượng Bộ sưu tập (Collection)

Để vận hành MongoDB trong Golang, bạn cần lấy đối tượng bộ sưu tập trước, sau đó bạn có thể thực hiện các hoạt động CRUD trên đối tượng bộ sưu tập.

// Thiết lập tên cơ sở dữ liệu thông qua Database, và thiết lập tên bộ sưu tập thông qua Collection
collection := client.Database("testing").Collection("numbers")

Lưu ý: Theo đặc điểm của MongoDB, không cần thiết phải tạo cơ sở dữ liệu và bộ sưu tập trước. Chúng sẽ được tạo tự động khi dữ liệu được ghi lần đầu.

Chèn Tài Liệu

Chèn dữ liệu bằng cách sử dụng hàm InsertOne.

// Đối tượng Context, thường được sử dụng để đặt thời gian chờ yêu cầu, bạn cũng có thể tái sử dụng đối tượng context đã tạo trước đó, không cần phải định nghĩa lại
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Chèn tài liệu, ở đây chúng ta sử dụng kiểu bson.D để mô tả tài liệu JSON, bson.D đại diện cho một mảng JSON
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})

// Lấy id của tài liệu mới được thêm
id := res.InsertedID

Bạn cần nhập các gói sau:

import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

Lưu ý: Trong Golang, gói bson được sử dụng để đại diện cho cấu trúc dữ liệu tài liệu JSON. Các chương sau sẽ chi tiết về cách biểu diễn cấu trúc lưu trữ dữ liệu MongoDB trong Golang.

package main
import (
    "context"
    "fmt"
    "time"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)
func main() {
    // Đặt địa chỉ kết nối MongoDB
    uri := "mongodb://root:123456@localhost:27017/admin"
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    // Kết nối tới MongoDB
    client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
    if err != nil {
        panic(err)
    }

    defer func() {
        // Giải phóng kết nối với độ trễ
        if err = client.Disconnect(ctx); err != nil {
            panic(err)
        }
    }()

    // Kiểm tra xem kết nối MongoDB có thành công không
    if err := client.Ping(ctx, readpref.Primary()); err != nil {
        panic(err)
    }
    fmt.Println("Kết nối MongoDB thành công!")

    // Lấy bộ sưu tập numbers
    collection := client.Database("testing").Collection("numbers")

    // Chèn một tài liệu
    res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
    id := res.InsertedID
    fmt.Println("Id tài liệu mới=", id)
}