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