บทนี้จะแนะนำการค้นหาทางภูมิศาสตร์ของ MongoDB ซึ่งรองรับการค้นหาภายในรูปทรงเรขาคณิตและการบรรจุ
สถานการณ์การใช้งาน:
- วาดวงกลมบนแผนที่และค้นหาข้อมูลภายในวงกลม
แผ่นที่ฐานข้อมูลทางภูมิศาสตร์สำหรับ MongoDB
รูปแบบการจัดเก็บข้อมูลทางภูมิศาสตร์สำหรับ MongoDB
การต้องการก่อนการค้นหาข้อมูลโดยระยะทางคือดังนี้:
- ข้อมูลของแต่ละเอกสารมีฟิลด์ที่ใช้เก็บข้อมูลพิกัด ตัวอย่างเช่น: ฟิลด์ตำแหน่งเก็บพิกัดของร้าน
- สร้างดัชนีพื้นที่ 2dsphere หรือ 2d
ตัวดำเนินการ $geoWithin
มักใช้สำหรับค้นหาจุดพิกัดที่อยู่ภายในช่วงเรขาคณิตที่ระบุ เช่น: เมื่อค้นหาบ้านโดยการวาดบนแผนที่ วาดพื้นที่บนแผนที่และค้นหาบ้านภายในพื้นที่นั้น
รูปแบบระบุ:
{
<ฟิลด์ตำแหน่ง>: { // ฟิลด์ที่ต้องการค้นหา
$geoWithin: {
$geometry: {
type: , // รองรับเฉพาะ Polygon หรือ MultiPolygon
coordinates: [ <coordinates> ] // คอลเลกชันของจุดพิกัดเรขาคณิต
}
}
}
}
ตัวอย่าง:
db.places.find(
{
loc: { // ฟิลด์ loc เก็บข้อมูลพิกัด
$geoWithin: {
$geometry: {
type: "Polygon" ,
coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // ค้นหาข้อมูลภายในพื้นที่เรขาคณิตดังกล่าว
}
}
}
}
)
ค้นหาข้อมูลเอกสารภายในพื้นที่เรขาคณิตที่ระบุในคอลเลกชัน places
ตัวดำเนินการ $geoIntersects
ความแตกต่างจาก $geoWithin คือ $geoIntersects ใช้เพื่อกำหนดว่ามีการตัดกันระหว่างทั้งสองรูปทรงหรือไม่
รูปแบบ:
{
<ฟิลด์ตำแหน่ง>: { // ฟิลด์ที่เก็บจุดพิกัดเรขาคณิต
$geoIntersects: {
$geometry: {
type: "<ประเภทวัตถุ geojson>" , // ประเภทเรขาคณิต
coordinates: [ <coordinates> ] // คอลเลกชันของจุดพิกัดเรขาคณิต ค้นหาข้อมูลที่มีการตัดกันกับเรขาคณิตดังกล่าว
}
}
}
}
ตัวอย่าง:
db.places.find(
{
loc: { // ฟิลด์ loc เก็บข้อมูลพื้นที่ ซึ่งเป็นรูปทรงเรขาคณิต
$geoIntersects: {
$geometry: {
type: "Polygon" ,
coordinates: [
[ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // ค้นหาข้อมูลที่มีการตัดกันกับเรขาคณิตดังกล่าว
]
}
}
}
}
)