Cách triển khai các tính năng không gian địa lý MongoDB

Cach Trien Khai Cac Tinh Nang Khong Gian Dia Ly Mongodb



Tính năng không gian địa lý của MongoDB cung cấp một cách đơn giản để lưu trữ dữ liệu địa lý trong cơ sở dữ liệu. Về cơ bản, chúng ta có thể lưu trữ dữ liệu không gian địa lý trong MongoDB dưới dạng đối tượng GeoJSON. GeoJSON là định dạng mã nguồn mở và miễn phí dựa trên Ký hiệu đối tượng JavaScript với dữ liệu địa lý đơn giản. Chức năng này rất quan trọng đối với các ứng dụng yêu cầu dịch vụ dựa trên vị trí như quy trình lập bản đồ, dựa trên tìm kiếm vị trí và các dịch vụ khác. Bài viết này đề cập đến tính năng không gian địa lý với cách triển khai ví dụ.

Thêm tài liệu vào Bộ sưu tập các tính năng không gian địa lý

Để chứng minh chức năng của tính năng Không gian địa lý MongoDB, chúng tôi cần các tài liệu cho bộ sưu tập cụ thể. Chúng ta chèn một vài tài liệu vào bộ sưu tập “khu vực” như sau:

db.area.insertMany( [
{
tên: 'Công viên trẻ em' ,
Loại địa điểm: 'Điểm' , tọa độ: [ - 60,97 , 30,77 ] },
loại: 'Vườn'
},
{
tên: 'Khu sinh viên' ,
Loại địa điểm: 'Điểm' , tọa độ: [ - 60,9928 , 30.7193 ] },
loại: 'Vườn'
},
{
tên: 'Sân bóng đá' ,
Loại địa điểm: 'Điểm' , tọa độ: [ - 60.9375 , 30.8303 ] },
loại: 'Sân vận động'
}
] )

Chúng tôi có tài liệu chứa dữ liệu vị trí như tọa độ. Ngoài ra, chúng tôi tạo chỉ mục không gian địa lý trên trường để tối ưu hóa hiệu suất của các truy vấn không gian địa lý.









Ví dụ 1: Sử dụng Toán tử truy vấn $geoIntersects

Đầu tiên, chúng ta có toán tử $geoIntersects của tính năng không gian địa lý giao với đối tượng được cung cấp. Hãy xem xét việc triển khai toán tử $geoIntersects sau đây:



db.area.find({ location: { $geoIntersects: { $geometry: { type: 'Điểm' ,

tọa độ: [ - 60,97 , 30,77 ] } } } })

Trong ví dụ này, chúng tôi gọi bộ sưu tập “khu vực” cùng với thao tác “tìm”. Đối với phương thức find(), chúng tôi chuyển bộ trường “vị trí” cho toán tử truy vấn $geoIntersects của tính năng không gian địa lý. Điều này được sử dụng để kiểm tra xem điểm đã chỉ định có giao nhau với hình học được lưu trữ trong trường hình học hay không.





Sau đó, toán tử $geoIntesects lấy toán tử $geometry trong đó trường loại được đặt với giá trị “Điểm” và trường tọa độ được cung cấp với các giá trị “tọa độ”. Ở đây, $geometry được xác định để so sánh không gian địa lý.

Đầu ra sau đây là nơi truy xuất tài liệu dự kiến ​​và nơi trường hình học chứa đối tượng hình học giao với điểm đã chỉ định:



Ví dụ 2: Sử dụng toán tử truy vấn $near

Toán tử $near cũng là tính năng không gian địa lý được sử dụng để thực hiện các truy vấn không gian địa lý nhằm xác định các tài liệu ở gần một địa điểm nhất định về mặt địa lý. Nó lấy các tài liệu được sắp xếp theo mức độ gần nhau của chúng với vị trí đã chỉ định. Ở đây, chúng tôi cung cấp cách triển khai toán tử $near:

db.area.find(
{
vị trí:
{ $gần :
{
$ hình học: { loại: 'Điểm' ,  tọa độ: [ - 60.9667 , 30,78 ] },
$minKhoảng cách: 1000 ,
$maxKhoảng cách: 5000
}
}
}
)

Trong ví dụ này, chúng tôi xác định trường “vị trí” của bộ sưu tập “khu vực” bên trong thao tác “tìm”. Sau đó, chúng tôi đặt toán tử truy vấn $gần của tính năng không gian địa lý cho trường “vị trí” đó. Toán tử $gần tìm kiếm điểm gần với điểm tọa độ đã cho. Tiếp theo, chúng tôi sử dụng các tham số $minDistance và $maxDistance trong toán tử $near được cung cấp các giá trị nhất định để truy xuất tài liệu trong phạm vi khoảng cách được chỉ định từ điểm đã cho.

Tài liệu được truy xuất ở đầu ra gần các vị trí hoặc điểm quan tâm được chỉ định trong bộ sưu tập “khu vực” không gian địa lý:

Ví dụ 3: Sử dụng toán tử truy vấn $nearsphere

Ngoài ra, chúng ta có toán tử $nearSphere tương tự như toán tử $near, nhưng $nearSphere tính đến hình dạng hình cầu của Trái đất khi tính toán khoảng cách.

db.area.find(
{
vị trí: {
$gầnSphere: {
$ hình học: {
kiểu : 'Điểm' ,
tọa độ : [ - 60.9667 , 30,78 ]
},
$minKhoảng cách: 1000 ,
$maxKhoảng cách: 5000
}
}
}
)

Trong ví dụ này, chúng tôi sử dụng toán tử $nearsphere của truy vấn không gian địa lý. Toán tử $nearspehere ở đây tìm kiếm tài liệu có các điểm gần nhất gần với các điểm được chỉ định trong truy vấn và các điểm được đặt thành mảng trường tọa độ.

Sau đó, chúng tôi tinh chỉnh kết quả bằng cách thiết lập các tham số $minDistance và $maxDistance. Tham số $minDistance đảm bảo rằng các tài liệu được trả về cách điểm được chỉ định ít nhất 1000 mét, trong khi tham số $maxDistance giới hạn kết quả ở các vị trí cách đó không quá 5000 mét.

Tài liệu được hiển thị ở đầu ra với vị trí trong phạm vi một mét được chỉ định tính từ điểm có tọa độ đã cho:

Ví dụ 4: Sử dụng toán tử truy vấn $geoWithin

Tiếp theo, chúng ta có toán tử $geoWithin trong MongoDB, được sử dụng cho các truy vấn không gian địa lý để tìm các tài liệu hoàn toàn nằm trong một hình dạng được chỉ định, chẳng hạn như hình tròn. Chúng ta hãy xem phần trình diễn sau đây về truy vấn $geoWithin:

db.area.find({ vị trí:

{ $geoWithin:

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

Trong ví dụ này, chúng tôi sử dụng toán tử $geoWithin để tìm tài liệu của bộ sưu tập “khu vực” trong một khu vực hình tròn nhất định trên hình cầu 2D. Đối với điều này, chúng tôi chỉ định toán tử $centerSphere bên trong toán tử $geoWithin lấy hai đối số làm điểm trung tâm, có khả năng đại diện cho điểm tọa độ ở đây và bán kính của vòng tròn đại diện cho giá trị khoảng cách tính bằng dặm.

Tài liệu kết quả được lấy ra như sau, biểu thị một điểm không gian địa lý nằm trong vòng tròn được xác định bởi điểm trung tâm đã cho và bán kính khoảng 3 dặm:

Ví dụ 5: Sử dụng Toán tử truy vấn $geoNear

Hơn nữa, toán tử $geoNear cũng là toán tử không gian địa lý được sử dụng cho đường dẫn tổng hợp. Nó thực hiện truy vấn không gian địa lý và trả về các tài liệu được sắp xếp theo mức độ gần với một điểm được chỉ định. Ở đây, chúng tôi đã cung cấp toán tử $geoNear được gọi bên trong đường dẫn tổng hợp.

db.area.aggregate([
{
$geoGần: {
gần: { loại: 'Điểm' , tọa độ: [ - 60.99279 , 30.719296 ] },
trường khoảng cách: 'dist.tính toán' ,
Khoảng cách tối đa: 2 ,
truy vấn: { danh mục: 'Vườn' },
bao gồmLocs: 'dist.location' ,
hình cầu: đúng
}
}
])

Trong ví dụ này, chúng tôi gọi phương thức tổng hợp của MongoDB và định nghĩa toán tử $geoNear bên trong nó. Toán tử $geoNear được đặt với một số tham số để chỉ định hành vi truy vấn. Đầu tiên, chúng tôi đặt tham số “gần” cung cấp các giá trị “tọa độ” làm điểm tham chiếu để tìm kiếm.

Sau đó, chúng tôi sử dụng tham số “distanceField” để chỉ định trường được cung cấp làm trường kết quả. Trường kết quả đã đặt này lưu trữ khoảng cách giữa mỗi tài liệu và điểm tham chiếu. Tiếp theo, chúng tôi xác định tham số “maxDistance” với giá trị “2” biểu thị khoảng cách tối đa tính bằng mét.

Sau đó, chúng ta có tham số “truy vấn” để lọc tài liệu theo trường “danh mục” và chỉ xem xét các tài liệu có “danh mục” là “Công viên”. Sau đó, chúng tôi gọi tham số “includeLocs” để chứa thông tin vị trí. Cuối cùng, chúng tôi chỉ định tham số “hình cầu” với giá trị “đúng” để tính toán khoảng cách bằng hệ tọa độ hình cầu 2D.

Đường dẫn tổng hợp thể hiện tài liệu ở đầu ra hiển thị thông tin theo tham số tương ứng. Trường “dist.tính toán” sau đây hiển thị khoảng cách của từng tài liệu từ điểm tham chiếu:

Phần kết luận

Chúng tôi biết rằng khả năng không gian địa lý của MongoDB giúp chúng tôi xử lý và truy vấn thông tin dựa trên vị trí một cách hiệu quả. Chúng tôi đã tìm hiểu cách triển khai tính năng không gian địa lý bằng cách sử dụng các toán tử khác nhau của nó bằng chương trình mẫu. Chúng tôi có nhiều chức năng và phương pháp khác cũng có lợi cho nhiều ứng dụng.