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