مقدمه

در این فصل، نحوه استفاده از جستجوی اسناد 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' and qty < 30 
        {"status", "A"},
        {"qty", bson.D{{"$lt", 30}}},
    })

شرایط جستجوی or

مشابه عبارت منطقی or در SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // شرط معادل: status = "A" OR qty < 30
        {"$or", //استفاده از عملگر $or
            bson.A{ //استفاده از تعریف آرایه bson.A
                bson.D{{"status", "A"}},
                bson.D{{"qty", bson.D{{"$lt", 30}}}},
            }},
    })

مثال جستجوی ترکیبی

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // شرط معادل: status = "A" AND ( qty < 30 OR item LIKE "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 برای بازیابی تمام نتایج جستجو و ذخیره نتایج در متغیر نتایج.
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 برای ذخیره نتیجه در متغیر نتیجه
err = collection.FindOne(ctx, filter).Decode(&result)

// بررسی خطاهای جستجو
if err == mongo.ErrNoDocuments {
    // اسنادی یافت نشد
    fmt.Println("سند وجود ندارد")
} else if err != nil {
    log.Fatal(err)
}
// دیگر بررسی‌ها

نکته: برای زبان‌های برنامه‌نویسی پیچیده‌تر در MongoDB، لطفاً به آموزش MongoDB مراجعه کنید.