مقدمه فصل

در این فصل، با جستجوهای جغرافیایی MongoDB در Golang آشنا می‌شویم، شامل نحوه ذخیره اطلاعات مکان و جستجو بر اساس فاصله است.

آموزش‌های پیش‌نیاز

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

آماده‌سازی داده‌های آزمایشی

اطلاعاتی حاوی مختصات جغرافیایی را در مجموعه coll وارد کنید. فیلد location شامل مختصات عرض و طول جغرافیایی فروشگاه‌هاست.

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}}
		}},
	}
}

نتیجه، خطا := coll.InsertMany(context.Background(), docs)

جستجو بر اساس فاصله

از اپراتور $near برای انجام جستجوی فاصله استفاده کنید. فرض کنید که مجموعه coll اطلاعات فروشگاه‌ها را نگهداری می‌کند و فیلد location شامل مختصات هر فروشگاه است، کد زیر بهترین فروشگاه را به من جستجو می‌کند (حداقل فاصله ۱۰۰۰ متر، حداکثر فاصله ۵۰۰۰ متر).

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 است.