مقدمة الفصل

يقدم هذا الفصل استعلامات Golang MongoDB الجغرافية، بما في ذلك كيفية تخزين معلومات الموقع والاستعلام بالمسافة.

الدروس المسبقة

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

تجهيز البيانات التجريبية

اكتب بعض البيانات التي تحتوي على الإحداثيات الجغرافية داخل مجموعة البيانات coll. يخزن حقل الموقع إحداثيات خط العرض وخط الطول للمتاجر.

 docs := []interface{}{
	bson.D{
		{"title", "دجاج هاينان المطهو بالبخار"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.240015, 39.899617}}
		}},
	},
	bson.D{
		{"title", "لحم الخنزير المشوي بطريقة قوانغدونغ"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.268854, 39.900276}}
		}},
	},
	bson.D{
		{"title", "وز مشوي بطريقة قوانغدونغ"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.264905, 39.902778}}
		}},
	},
	bson.D{
		{"title", "فطيرة شانشي"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.288938, 39.893164}}
		}},
	},
	bson.D{
		{"title", "الزلابية الهنغزوفية"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.286191, 39.910415}}
		}},
	}
}

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

الاستعلام بالمسافة

استخدم مشغل $near لتنفيذ الاستعلام بالمسافة. مفترضًا أن مجموعة البيانات coll تخزن بيانات المتجر، ويخزن حقل الموقع إحداثيات كل متجر، يقوم الكود التالي بالاستعلام عن أقرب متجر إلي (بحد أدنى للمسافة 1000 متر وحد أقصى للمسافة 5000 متر).

 cursor, err := coll.Find(
	context.Background(),
	bson.D{{"location", bson.D{
		{"$near": bson.D{
			{"$geometry": bson.D{{"type":"Point"}, {"coordinates": bson.A{116.288938,39.893164}}}, // إحداثياتي الحالية
			{"$minDistance": 1000}, // الحد الأدنى للمسافة
			{"$maxDistance": 5000} // الحد الأقصى للمسافة
		}}
	}}}
)

التعبير المعادل:

{
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] }, // إحداثياتي
            $minDistance: 1000, // الحد الأدنى للمسافة
            $maxDistance: 5000 // الحد الأقصى للمسافة
          }
       }
}

التعبير هو نفسه كتعبير MongoDB الأصلي، الاختلاف الوحيد هو إعادة وصفه باستخدام هيكل البيانات في Golang.