บทนี้นำเสนอวิธีใช้งานการค้นหาเอกสาร 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