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

ใช้การค้นหาเชิงพื้นที่ใน การดำเนินการที่เข้ากันได้กับ 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
      }
    }
  }

หากดัชนีมีการแบ่งพาร์ติชัน คุณจะกรองตามพาร์ติชันได้โดย รวมพาร์ติชันไว้ในตัวกรองความเท่าเทียม "และ" ภายในคําค้นหา ตัวอย่างเช่น หากคุณมีพาร์ติชัน 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 ไม่รองรับในคำค้นหาการรวบรวม