แนะนำในบทนี้จะชี้แจงเกี่ยวกับการทำงานพื้นฐานของ MongoDB จากมุมมองของภาษา Golang

หมายเหตุ: บทนี้ใช้ Go language driver package ที่ถูกต้องโดยตรงจาก MongoDB

บทนำเบื้องต้น

MongoDB Tutorial

หมายเหตุ: หากคุณไม่เคยรู้จัก 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)
}