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

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

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

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

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

ออบเจ็กต์ GeoJSON

หากต้องการเรียกใช้การค้นหาเชิงภูมิสารสนเทศกับช่องในคอลเล็กชัน ช่องที่คุณค้นหาต้องเป็นออบเจ็กต์ GeoJSON หรือ GeoPoint

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

ในตัวอย่างต่อไปนี้ ระบบจะใช้โอเปอเรเตอร์ $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 ในการค้นหาการรวม