แนะนำในบทนี้จะชี้แจงเกี่ยวกับการทำงานพื้นฐานของ MongoDB จากมุมมองของภาษา Golang
หมายเหตุ: บทนี้ใช้ Go language driver package ที่ถูกต้องโดยตรงจาก MongoDB
บทนำเบื้องต้น
หมายเหตุ: หากคุณไม่เคยรู้จัก MongoDB กรุณาศึกษาความรู้เกี่ยวกับ MongoDB ก่อน บทนี้ของ Golang จะไม่ทำซ้ำกับความรู้ที่เกี่ยวข้อง
ความต้องการพื้นฐาน
- Go 1.10 หรือสูงกว่า
- MongoDB 2.6 หรือสูงกว่า
ติดตั้ง Dependency
go get go.mongodb.org/mongo-driver/mongo
เชื่อมต่อกับ MongoDB
import (
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
// ที่อยู่เชื่อมต่อ MongoDB
uri := "mongodb://localhost:27017"
// รับวัตถุ context, คุณสามารถตั้งเวลาหมดเวลาได้
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// เชื่อมต่อกับ MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
ฟังก์ชัน Connect ไม่ block goroutine นั่นคือการดำเนินการ MongoDB โดยตรงหลังจากเรียกใช้เมทอด Connect อาจทำให้เกิดข้อผิดพลาดเพราะ MongoDB ยังไม่ได้เชื่อมต่อเรียบร้อยแล้ว คุณสามารถใช้เมทอด Ping เพื่อตรวจสอบว่า MongoDBได้เชื่อมต่อเรียบร้อยแล้ว
// ทำการ Ping ถ้าเชื่อมต่อเรียบร้อย จะไม่มีerror
err = client.Ping(ctx, readpref.Primary())
ที่อยู่เชื่อมต่อ MongoDB
ที่อยู่เชื่อมต่อ MongoDB ประกอบด้วยข้อมูลสำคัญ เช่น ที่อยู่เซิฟเวอร์, หมายเลขพอร์ต, บัญชี, และรหัสผ่าน รูปแบบเป็นดังนี้:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
ตัวอย่าง:
// ที่อยู่ localhost:27017 พร้อม username และ password ปกติ
mongodb://localhost:27017
// ที่อยู่ localhost:27017 พร้อมบัญชี = root, รหัสผ่าน = 123456, และเชื่อมต่อเข้าไปที่ฐานข้อมูล = admin
mongodb://root:123456@localhost:27017/admin
ปล่อยทรัพยากรการเชื่อมต่อ
หากทำการเชื่อมต่อไม่ได้มีความจำเป็นต้องปล่อยทรัพยากรการเชื่อมต่อด้วยตนเอง
defer func() {
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
รับตัวอย่างของคอลเล็คชัน
สำหรับการดำเนินการ MongoDB ใน Golang คุณต้องไปรับตัวอย่างของคอลเล็คชันก่อน จากนั้นคุณสามารถดำเนินการ CRUD ในตัวอย่างของคอลเล็คชัน
// ตั้งชื่อฐานข้อมูลผ่าน Database และตั้งชื่อคอลเล็คชันผ่าน Collection
collection := client.Database("testing").Collection("numbers")
หมายเหตุ: ตามลักษณะของ MongoDB ไม่จำเป็นที่จะต้องสร้างฐานข้อมูลและคอลเล็คชันล่วงหน้า มันจะถูกสร้างโดยอัตโนมัติเมื่อข้อมูลถูกเขียนครั้งแรก
แทรกรายการ
การแทรกรายการโดยใช้ฟังก์ชั่น InsertOne
// วัตถุ Context ที่ใช้ทั่วไปเพื่อตั้งค่าเวลาหมดเวลาคำขอ คุณสามารถ reuse วัตถุ context ที่สร้างไว้ก่อนหน้านี้ได้โดยไม่ต้องนิยามใหม่
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// แทรกรายการ ที่นี่เราใช้ประเภท bson.D เพื่อเขียนซับเรย์ JSON document, bson.D แทนซับเรย์ JSON
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
// เข้าถึงไอดีของเอกสารที่เพิ่มไว้
id := res.InsertedID
คุณจำเป็นต้องนำเข้า package ต่อไปนี้:
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"
)
หมายเหตุ: ใน Golang, package bson ใช้บ่งบอกโครงสร้างข้อมูลเอกสาร JSON ต่อไปนี้จะอธิบายถึงการแสดงข้อมูลโครงสร้างการจัดเก็บข้อมูลของ MongoDB ใน 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() {
// ตั้งที่อยู่เชื่อมต่อ MongoDB
uri := "mongodb://root:123456@localhost:27017/admin"
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// เชื่อมต่อ MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
// ปล่อยเชื่อมต่อโดยมีการล่าช้า
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
// ตรวจสอบว่าการเชื่อมต่อ MongoDB เป็นที่เรียบร้อย
if err := client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
}
fmt.Println("MongoDB ได้เชื่อมต่อเป็นที่เรียบร้อยแล้ว!")
// รับคอลเล็คชั่นตัวเลข
collection := client.Database("testing").Collection("numbers")
// แทรกรายการ
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
id := res.InsertedID
fmt.Println("ไอดีเอกสารใหม่ =", id)
}