บทนี้จะแนะนำการค้นหาทางภูมิศาสตร์ของ 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 ] ] // ค้นหาข้อมูลที่มีการตัดกันกับเรขาคณิตดังกล่าว
             ]
          }
       }
     }
   }
)