ใช้การค้นหาทางภูมิศาสตร์

ใช้การค้นหาเชิงพื้นที่ในฟังก์ชันที่เข้ากันได้กับ MongoDB เพื่อค้นหาเอกสารที่อยู่ในช่วงที่กำหนดจากลองจิจูดและละติจูดที่เฉพาะเจาะจง

ก่อนเริ่มต้น

  1. ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูลฟังก์ชันที่เข้ากันได้กับ MongoDB ที่มีอยู่ หรือ สร้างฐานข้อมูลและเชื่อมต่อกับฐานข้อมูลดังกล่าว

  2. ตรวจสอบว่าคุณมีดัชนี 2dsphere อย่างน้อย 1 รายการ หรือ สร้างดัชนี 2dsphere

ออบเจ็กต์ GeoJSON

หากต้องการเรียกใช้การค้นหาเชิงพื้นที่กับฟิลด์ในคอลเล็กชัน ฟิลด์ที่คุณค้นหา ต้องเป็น ออบเจ็กต์ GeoJSON หรือ GeoPoint

คุณสามารถทำการค้นหาเชิงพื้นที่โดยใช้โอเปอเรเตอร์ $near ซึ่งจะคำนวณระยะทางของจุดทางภูมิศาสตร์เทียบกับจุดทางภูมิศาสตร์ภายในเอกสาร จากนั้นระบบจะจัดเรียงเอกสารเหล่านี้จากระยะทางที่ใกล้ที่สุดไปไกลที่สุดในผลการค้นหา นอกจากนี้ คุณยังลบล้างลำดับการจัดเรียงนี้ได้โดยกำหนดการจัดเรียงรองนอกเหนือจาก $natural ในการค้นหา โอเปอเรเตอร์ $near ต้องอยู่ในฟิลด์เอกสารในตัวกรองการค้นหา และต้องมีฟิลด์ $geometry GeoJSON

ในตัวอย่างต่อไปนี้ ระบบจะใช้โอเปอเรเตอร์ $near เพื่อคำนวณระยะทาง ระหว่างจุดทางภูมิศาสตร์ (-122.084, 37.4221) กับจุดทางภูมิศาสตร์ที่อยู่ในฟิลด์ location ของเอกสารทั้งหมดใน myCollection. ระบบจะแสดงเอกสาร และจัดเรียงตามระยะทางที่ใกล้ที่สุดไปไกลที่สุดระหว่างจุด 2 จุด

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

นอกจากนี้ คุณยังใช้ฟิลด์ $maxDistance และ $minDistance ที่ไม่บังคับเพื่อควบคุมระยะทางเป็นเมตรจากจุดของการค้นหาได้ด้วย ตัวอย่างต่อไปนี้แสดงการค้นหาที่เอกสารที่แสดงต้องอยู่ห่างจากจุด (-122.084, 37.4221) อย่างน้อย 500 เมตรและไม่เกิน 2,000 เมตร

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

หากดัชนีมีการแบ่งพาร์ติชัน คุณสามารถกรองตามพาร์ติชันได้โดยใส่พาร์ติชันในตัวกรองความเท่ากัน "and" ภายในคำค้นหา ตัวอย่างเช่น หากคุณมีพาร์ติชัน region และต้องการกรองผลการค้นหาตามภูมิภาค midwest คุณสามารถทำได้ดังนี้

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

ค่าของพาร์ติชันต้องเป็นสตริง ตัวกรองพาร์ติชันต้องเข้าร่วมกับคำค้นหาด้วยโอเปอเรเตอร์ $and

ข้อจำกัด

  • คุณไม่สามารถใช้โอเปอเรเตอร์ $near และโอเปอเรเตอร์ $text ในการค้นหาเดียวกัน
  • คุณไม่สามารถซ้อน $near ในคำสั่ง $or หลายอนุประโยคได้ เว้นแต่ว่า $near จะเป็นนิพจน์เดียวในอนุประโยค $or
  • คุณไม่สามารถใช้ $near กับโอเปอเรเตอร์ $not หรือ $nor ในการค้นหา
  • ระบบไม่รองรับ $near ในการค้นหาการรวบรวม