ใช้การค้นหาเชิงพื้นที่ในฟังก์ชันที่เข้ากันได้กับ MongoDB เพื่อค้นหาเอกสารที่อยู่ในช่วงที่กำหนดจากลองจิจูดและละติจูดที่เฉพาะเจาะจง
ก่อนเริ่มต้น
ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงฐานข้อมูลฟังก์ชันที่เข้ากันได้กับ MongoDB ที่มีอยู่ หรือ สร้างฐานข้อมูลและเชื่อมต่อกับฐานข้อมูลดังกล่าว
ตรวจสอบว่าคุณมีดัชนี 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ในการค้นหาการรวบรวม