บทนี้นำเสนอวิธีใช้งานการค้นหาเอกสาร MongoDB ใน Golang

บทนำ

เคล็ดลับ: หากคุณไม่เคยใช้รูปแบบคำค้นของ MongoDB มาก่อน โปรดอ่านบทนำ MongoDB ก่อน รูปแบบนิพจน์ที่ใช้สำหรับการดำเนินการ MongoDB ใน Golang จะเหมือนกัน

เตรียมข้อมูลทดสอบ

แทรกข้อมูลเอกสารเป็นกุ๊กละเซ็ตเข้าในคอลเล็กชัน "coll"

docs := []interface{}{
    bson.D{
        {"item", "journal"},
        {"qty", 25},
        {"size", bson.D{
            {"h", 14},
            {"w", 21},
            {"uom", "cm"},
        }},
        {"status", "A"},
    },
    // ... (ข้อมูลเอกสารอื่นๆ)
}

result, err := coll.InsertMany(context.Background(), docs)

ค้นหาเอกสารทั้งหมด

cursor, err := coll.Find(
    context.Background(),
    bson.D{}, // ตั้งเงื่อนไขคิวรี่ว่าง
)

เงื่อนไขคิวรี่ความเท่าเทียม

เหมือนกับการจับคู่ความเท่าเทียมใน SQL

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", "D"}},   // เงื่อนไขเทียม: status = D
)

ตัวดำเนินการค้นหา in

เหมือนกับการค้นหา in ใน SQL

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // เงื่อนไขเทียม: status in ('A', 'D')

เงื่อนไขค้นหา and

เหมือนกับการใช้เงื่อนไขตรรกะ and ใน SQL

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // เงื่อนไขเทียม: status='A' และ qty < 30 
        {"status", "A"},
        {"qty", bson.D{{"$lt", 30}}},
    })

เงื่อนไขค้นหา or

เหมือนกับการใช้เงื่อนไขตรรกะ or ใน SQL

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // เงื่อนไขเทียม: status = "A" หรือ qty < 30
        {"$or", // ใช้ตัวดำเนินการ $or
            bson.A{ // ใช้การกำหนดประเภทข้อมูล array ด้วย bson.A
                bson.D{{"status", "A"}},
                bson.D{{"qty", bson.D{{"$lt", 30}}}},
            }},
    })

ตัวอย่างค้นหาผสม

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // เงื่อนไขเทียม: status = "A" และ ( qty < 30 หรือ item คล้าย "p%")
        {"status", "A"},
        {"$or", bson.A{
            bson.D{{"qty", bson.D{{"$lt", 30}}}},
            bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
        }},
    })

การวิ่งผลลัพธ์ค้นหา

ตัวอย่าง 1

// ค้นหาเอกสารที่ชื่อเป็น 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
	log.Fatal(err)
}

// กำหนดอาร์เรย์ของเอกสารประเภท bson.M โดยใช้ bson.M เป็นโครงสร้างข้อมูลคีย์-มูลค่าที่คล้ายกับแผนที่
var results []bson.M
// ใช้ฟังก์ชัน All เพื่อดึงผลลัพธ์ค้นหาทั้งหมดและบันทึกผลลัพธ์ไว้ที่ตัวแปร results
if err = cursor.All(context.TODO(), &results); err != nil {
	log.Fatal(err)
}

// วิ่งผลลัพธ์อาร์เรย์
for _, result := range results {
	fmt.Println(result)
}

คำอธิบาย: ตัวอย่างใช้ชนิด bson.M เพื่อเก็บข้อมูลเอกสาร คุณสามารถกำหนดชนิด struct ที่กำหนดเองได้เมื่อฟิลด์ตรงกับเอกสาร

ตัวอย่าง 2

// กำหนดตัวแปรของชนิด struct เพื่อบันทึกผลลัพธ์ค้นหา
var result struct {
    Value float64
}

// กำหนดเงื่อนไขค้นหาเอกสารชื่อ = 'pi'
filter := bson.D{{"name", "pi"}}
// สร้างวัตถุ context และกำหนดเวลาถอยหลังค้นหาเป็น 5 วินาที
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// ค้นหาข้อมูลโดยใช้เงื่อนไข และใช้ฟังก์ชัน Decode เพื่อบันทึกผลลัพธ์ไว้ที่ตัวแปร result
err = collection.FindOne(ctx, filter).Decode(&result)

// ตรวจสอบข้อผิดพลาดในการค้นหา
if err == mongo.ErrNoDocuments {
    // เอกสารไม่พบ
    fmt.Println("ไม่พบเอกสาร")
} else if err != nil {
    log.Fatal(err)
}
// การจัดการอื่นๆ

เคล็ดลับ: สำหรับรูปแบบการค้นหา MongoDB ที่ซับซ้อนมากขึ้น โปรดอ้างอิงที่บทนำของ MongoDB