يقدم هذا الفصل شرحاً لاستخدام استعلامات مستندات Golang MongoDB.

البرامج التعليمية اللازمة

نصيحة: إذا كنت غير عارف بنحو بناء جمل الاستعلامات في MongoDB، الرجاء قراءة برنامج MongoDB التعليمي أولاً. بناء الجملة المستخدم لعمليات MongoDB في Golang هو نفسه.

تحظير البيانات التجريبية

أدخل دفعة من بيانات المستند إلى مجموعة coll.

docs := []interface{}{
    bson.D{
        {"item", "journal"},
        {"qty", 25},
        {"size", bson.D{
            {"h", 14},
            {"w", 21},
            {"uom", "cm"},
        }},
        {"status", "A"},
    },
    // ... (بيانات مستند أخرى)
}

نتيجة، خطأ := 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 في ('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{ // بتعريف نوع البيانات 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 لاسترداد كافة نتائج الاستعلام وحفظ النتائج في متغير النتائج.
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
}

// تعريف شرط الاستعلام عن المستند name = 'pi'
filter := bson.D{{"name", "pi"}}
// إنشاء كائن سياق وتعيين مهلة الاستعلام إلى 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 التعليمي.