วิธีการใช้คุณสมบัติ MongoDB Geospatial

Withi Kar Chi Khunsmbati Mongodb Geospatial



คุณลักษณะเชิงพื้นที่ของ MongoDB มอบวิธีที่ตรงไปตรงมาในการจัดเก็บข้อมูลทางภูมิศาสตร์ในฐานข้อมูล โดยพื้นฐานแล้ว เราสามารถจัดเก็บข้อมูลเชิงพื้นที่ใน MongoDB เป็นวัตถุ GeoJSON ได้ GeoJSON เป็นรูปแบบโอเพ่นซอร์สฟรีที่ขึ้นอยู่กับสัญลักษณ์วัตถุ JavaScript พร้อมข้อมูลทางภูมิศาสตร์ที่เรียบง่าย ฟังก์ชันนี้มีความสำคัญสำหรับแอปที่ต้องการบริการตามตำแหน่ง เช่น กระบวนการทำแผนที่ ตามการค้นหาตำแหน่ง และอื่นๆ บทความนี้ครอบคลุมคุณลักษณะเชิงพื้นที่พร้อมตัวอย่างการใช้งาน

การเพิ่มเอกสารลงในคอลเลกชันสำหรับคุณลักษณะเชิงพื้นที่

เพื่อสาธิตการทำงานของฟีเจอร์ MongoDB Geospatial เราจำเป็นต้องมีเอกสารสำหรับคอลเลกชันเฉพาะ เราแทรกเอกสารบางส่วนลงในคอลเลกชัน 'พื้นที่' ดังที่แสดงต่อไปนี้:

db.area.insertMany( [
{
ชื่อ: 'สวนเด็ก' ,
ที่ตั้ง: { ประเภท: 'จุด' , พิกัด: [ - 60.97 , 30.77 ] },
หมวดหมู่: 'สวน'
},
{
ชื่อ: “พื้นที่นักศึกษา” ,
ที่ตั้ง: { ประเภท: 'จุด' , พิกัด: [ - 60.9928 , 30.7193 ] },
หมวดหมู่: 'สวน'
},
{
ชื่อ: 'สนามฟุตบอล' ,
ที่ตั้ง: { ประเภท: 'จุด' , พิกัด: [ - 60.9375 , 30.8303 ] },
หมวดหมู่: 'สนามกีฬา'
}
] )

เรามีเอกสารที่มีข้อมูลตำแหน่งเช่นพิกัด นอกจากนี้ เรายังสร้างดัชนีภูมิสารสนเทศภาคสนามเพื่อเพิ่มประสิทธิภาพการสืบค้นภูมิสารสนเทศ









ตัวอย่างที่ 1: การใช้ตัวดำเนินการสืบค้น $geoIntersects

อันดับแรก เรามีตัวดำเนินการ $geoIntersects ของคุณลักษณะเชิงพื้นที่ซึ่งตัดกับวัตถุที่ให้มา พิจารณาการใช้งานตัวดำเนินการ $geoIntersects ต่อไปนี้:



db.area.find({ ตำแหน่ง: { $geoIntersects: { $geometry: { ประเภท: 'จุด' ,

พิกัด: [ - 60.97 , 30.77 ] } } } })

ในตัวอย่างนี้ เราเรียกคอลเลกชัน 'พื้นที่' พร้อมกับการดำเนินการ 'ค้นหา' สำหรับเมธอด find() เราจะส่งชุดฟิลด์ 'location' ไปยังตัวดำเนินการค้นหา $geoIntersects ของคุณลักษณะภูมิสารสนเทศ ใช้เพื่อตรวจสอบว่าจุดที่ระบุตัดกับเรขาคณิตที่จัดเก็บไว้ในฟิลด์เรขาคณิตหรือไม่





จากนั้น ตัวดำเนินการ $geoIntesects จะใช้ตัวดำเนินการ $geometry โดยที่ฟิลด์ประเภทถูกตั้งค่าด้วยค่า 'จุด' และฟิลด์พิกัดจะถูกกำหนดด้วยค่า 'พิกัด' ในที่นี้ $geometry ถูกกำหนดไว้สำหรับการเปรียบเทียบเชิงพื้นที่

ผลลัพธ์ต่อไปนี้คือตำแหน่งที่เรียกเอกสารที่คาดหวัง และตำแหน่งที่ฟิลด์เรขาคณิตมีวัตถุเรขาคณิตที่ตัดกับจุดที่ระบุ:



ตัวอย่างที่ 2: การใช้ $near ตัวดำเนินการสืบค้น

ตัวดำเนินการ $near ยังเป็นคุณลักษณะเชิงพื้นที่ที่ใช้ในการสืบค้นเชิงพื้นที่เพื่อระบุเอกสารที่อยู่ทางภูมิศาสตร์ใกล้กับสถานที่ที่กำหนด จะดึงเอกสารที่จัดเรียงตามความใกล้ชิดกับตำแหน่งที่ระบุ ที่นี่ เราจัดให้มีการดำเนินการ $near โอเปอเรเตอร์:

db.area.find(
{
ที่ตั้ง:
{ $ใกล้ :
{
$ เรขาคณิต: { ประเภท: 'จุด' ,  พิกัด: [ - 60.9667 , 30.78 ] },
$นาทีระยะทาง: 1,000 ,
$สูงสุดระยะทาง: 5,000
}
}
}
)

ในตัวอย่าง เรากำหนดฟิลด์ 'สถานที่' ของคอลเลกชัน 'พื้นที่' ภายในการดำเนินการ 'ค้นหา' จากนั้น เราตั้งค่าตัวดำเนินการค้นหา $near ของคุณลักษณะเชิงพื้นที่เป็นฟิลด์ 'ตำแหน่ง' นั้น ตัวดำเนินการ $near ค้นหาจุดใกล้ด้วยจุดพิกัดที่กำหนด ต่อไป เราใช้พารามิเตอร์ $minDistance และ $maxDistance ในตัวดำเนินการ $near ซึ่งมีค่าที่แน่นอนเพื่อดึงเอกสารภายในช่วงระยะทางที่ระบุจากจุดที่กำหนด

เอกสารจะถูกดึงออกมาในเอาต์พุตที่อยู่ใกล้กับตำแหน่งที่ระบุหรือจุดสนใจในคอลเลกชัน 'พื้นที่' เชิงพื้นที่:

ตัวอย่างที่ 3: การใช้ตัวดำเนินการสืบค้น $nearsphere

อีกทางหนึ่ง เรามีตัวดำเนินการ $nearsphere ซึ่งคล้ายกับตัวดำเนินการ $near แต่ $nearSphere คำนึงถึงรูปร่างทรงกลมของโลกเมื่อคำนวณระยะทาง

db.area.find(
{
ที่ตั้ง: {
$ใกล้ทรงกลม: {
$เรขาคณิต: {
พิมพ์ : 'จุด' ,
พิกัด : [ - 60.9667 , 30.78 ]
},
$นาทีระยะทาง: 1,000 ,
$สูงสุดระยะทาง: 5,000
}
}
}
)

ในตัวอย่างนี้ เราใช้ตัวดำเนินการ $nearsphere ของการสืบค้นเชิงพื้นที่ ตัวดำเนินการ $nearpehere ที่นี่ค้นหาเอกสารที่มีจุดที่ใกล้ที่สุดใกล้กับจุดที่ระบุไว้ในการสืบค้น และจุดต่างๆ จะถูกตั้งค่าเป็นอาร์เรย์ฟิลด์พิกัด

หลังจากนั้น เราปรับแต่งผลลัพธ์โดยการสร้างพารามิเตอร์ $minDistance และ $maxDistance พารามิเตอร์ $minDistance ช่วยให้แน่ใจว่าเอกสารที่ส่งคืนอยู่ห่างจากจุดที่ระบุอย่างน้อย 1,000 เมตร ในขณะที่พารามิเตอร์ $maxDistance จะจำกัดผลลัพธ์ไว้ที่ตำแหน่งที่อยู่ห่างออกไปไม่เกิน 5,000 เมตร

เอกสารจะแสดงในเอาต์พุตโดยมีตำแหน่งภายในเมตรที่ระบุจากจุดที่มีพิกัดที่กำหนด:

ตัวอย่างที่ 4: การใช้ตัวดำเนินการสืบค้น $geoWithin

ต่อไป เรามีตัวดำเนินการ $geoWithin ใน MongoDB ซึ่งใช้สำหรับการสืบค้นเชิงพื้นที่เพื่อค้นหาเอกสารที่มีรูปร่างที่ระบุโดยสมบูรณ์ เช่น วงกลม มาสาธิตการสืบค้น $geoWithin ดังต่อไปนี้:

db.area.find ({ ตำแหน่ง:

{ $ภูมิศาสตร์ภายใน:

{ $centerSphere: [ [ - 60.93414657 , 30.82302903 ], 3 / 3963.2 ] } } })

ในตัวอย่างนี้ เราใช้ตัวดำเนินการ $geoWithin เพื่อค้นหาเอกสารของคอลเลกชัน 'พื้นที่' ภายในพื้นที่วงกลมบนทรงกลม 2 มิติ สำหรับสิ่งนี้ เราระบุตัวดำเนินการ $centerSphere ภายในตัวดำเนินการ $geoWithin ซึ่งรับอาร์กิวเมนต์ทั้งสองเป็นจุดศูนย์กลาง ซึ่งน่าจะแสดงถึงจุดพิกัดที่นี่ และรัศมีของวงกลมซึ่งแทนค่าระยะทางเป็นไมล์

เอกสารผลลัพธ์จะถูกเรียกค้นดังต่อไปนี้ ซึ่งแสดงถึงจุดภูมิสารสนเทศที่อยู่ภายในวงกลมที่กำหนดโดยจุดศูนย์กลางที่กำหนดและรัศมีประมาณ 3 ไมล์:

ตัวอย่างที่ 5: การใช้ตัวดำเนินการสืบค้น $geoNear

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

db.area.รวม([
{
$ภูมิศาสตร์ใกล้: {
ใกล้: { ประเภท: 'จุด' , พิกัด: [ - 60.99279 , 30.719296 ] },
ระยะทางสนาม: 'dist.คำนวณ' ,
ระยะทางสูงสุด: 2 ,
แบบสอบถาม: { หมวดหมู่: 'สวน' },
รวมที่ตั้ง: 'dist.ที่ตั้ง' ,
ทรงกลม: จริง
}
}
])

ในตัวอย่างนี้ เราเรียกวิธีการรวมของ MongoDB และกำหนดตัวดำเนินการ $geoNear ที่อยู่ข้างใน ตัวดำเนินการ $geoNear ถูกตั้งค่าด้วยพารามิเตอร์หลายตัวเพื่อระบุพฤติกรรมการสืบค้น ขั้นแรก เราตั้งค่าพารามิเตอร์ 'ใกล้' ซึ่งให้ค่า 'พิกัด' เป็นจุดอ้างอิงในการค้นหา

จากนั้น เราใช้พารามิเตอร์ 'distanceField' เพื่อระบุฟิลด์ที่ให้ไว้เป็นฟิลด์ผลลัพธ์ ฟิลด์ผลลัพธ์ที่ตั้งค่าไว้นี้จะจัดเก็บระยะห่างระหว่างแต่ละเอกสารและจุดอ้างอิง ต่อไป เรากำหนดพารามิเตอร์ 'maxDistance' ด้วยค่า '2' ซึ่งแสดงถึงระยะทางสูงสุดเป็นเมตร

หลังจากนั้น เรามีพารามิเตอร์ “query” ซึ่งจะกรองเอกสารตามช่อง “category” และพิจารณาเฉพาะเอกสารที่ “category” คือ “Parks” เท่านั้น จากนั้นเราจะเรียกพารามิเตอร์ “includeLocs” เพื่อเก็บข้อมูลตำแหน่ง ในที่สุดเราก็ระบุพารามิเตอร์ 'ทรงกลม' ด้วยค่า 'จริง' ซึ่งจะคำนวณระยะทางโดยใช้ระบบพิกัดทรงกลม 2 มิติ

ไปป์ไลน์การรวมแสดงถึงเอกสารในเอาต์พุตซึ่งแสดงข้อมูลเทียบกับพารามิเตอร์ตามลำดับ ช่อง “dist.calculated” ต่อไปนี้จะแสดงระยะห่างของแต่ละเอกสารจากจุดอ้างอิง:

บทสรุป

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