บทนำ

ในบทนี้จะพาไปรู้จักกับ Golang MongoDB geospatial queries ซึ่งรวมถึงวิธีการเก็บข้อมูลตำแหน่งที่ตั้งและคิวรี่ตามระยะทาง

บทนำเบื้องต้น

เคล็ดลับ: หากคุณยังไม่คุ้นเคยกับรูปแบบการคิวรี่ 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}}
		}},
	}
}

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

คิวรี่ตามระยะทาง

ใช้ตัวดำเนินการ $near เพื่อดำเนินการคิวรี่ตามระยะทาง สมมติว่าคอลเลกชัน coll เก็บข้อมูลร้านค้า และฟิลด์ location เก็บพิกัยของแต่ละร้าน โค้ดต่อไปนี้คิวรี่ร้านค้าที่อยู่ใกล้ฉัน (ระยะทางต่ำสุด 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.