Chương này giới thiệu cách MongoDB lưu trữ dữ liệu địa lý. Để sử dụng được tính năng truy vấn địa lý của MongoDB, trước hết chúng ta cần hiểu cách lưu trữ dữ liệu địa lý.

Dữ liệu địa lý chủ yếu bao gồm các điểm, đường và hình học.

Một điểm trên bản đồ được xác định bởi tọa độ kinh độ và vĩ độ của nó. Nhiều điểm tạo thành một đường, và nhiều đường có thể tạo thành các hình dạng khác nhau.

Trong ứng dụng thực tế: Vị trí của một cửa hàng, "Tôi ở đâu?", và "Trường học ở đâu?" có thể được biểu diễn bằng cách sử dụng tọa độ. Mô tả phạm vi của một khuôn viên trường học hoặc một trung tâm mua sắm yêu cầu các hình dạng hình học.

Đối tượng GeoJSON

MongoDB sử dụng đối tượng GeoJSON để biểu diễn thông tin địa lý.

Các loại GeoJSON phổ biến bao gồm:

  • Point - biểu diễn một điểm tọa độ
  • LineString - biểu diễn một đường
  • Polygon - biểu diễn một đa giác

Định dạng lưu trữ các đối tượng GeoJSON trong các trường của MongoDB như sau:

<tên trường>: { type: <loại geojson>, coordinates: <tọa độ> }

Giải thích:

  • <tên trường> - Tên trường
  • type - Loại GeoJSON
  • coordinates - Một mảng các điểm tọa độ. Định dạng thay đổi tùy thuộc vào loại GeoJSON khác nhau.

Ví dụ:

vị trí: {
      type: "Point",  // loại dữ liệu địa lý, trong trường hợp này, nó là một điểm tọa độ
      coordinates: [-73.856077, 40.848447] // kinh độ, vĩ độ
}

Giải thích: Trường vị trí lưu trữ dữ liệu địa lý của loại điểm tọa độ.

Điểm Tọa Độ (Point)

Định dạng:

{ type: "Point", coordinates: [ kinh độ, vĩ độ ] }

Ví dụ:

{ type: "Point", coordinates: [ 40, 5 ] }

Đường (LineString)

Định dạng:

{ type: "LineString", coordinates: [ điểm1, điểm2, ...] }

Ví dụ:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

Đa Giác (Polygon)

Có thể được tạo thành từ một hoặc nhiều đường. Định dạng:

{
  type: "Polygon",
  coordinates: [ 
		dòng1,
		dòng2,
		....
	]
}

Ghi chú: Tọa độ bắt đầu và kết thúc của mỗi đoạn thẳng phải giống nhau để tạo thành một hình đóng.

Hình Dạng Bao Gồm Một Đoạn Thẳng Đơn

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // Tọa độ của đoạn thẳng, lưu ý rằng tọa độ đầu và cuối cùng phải giống nhau.
	]
}

Hình Dạng Bao Gồm Nhiều Đoạn Thẳng

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // Đoạn thẳng 1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // Đoạn thẳng 2
  ]
}

Chỉ Số Địa Lý

MongoDB hỗ trợ hai loại chỉ số địa lý để tăng tốc quá trình truy vấn dữ liệu GeoJSON.

2dsphere

Đây là một loại chỉ số hình học cầu, có nghĩa là khi tính khoảng cách giữa hai điểm, 2dsphere coi trái đất như một cầu.

Ví dụ về việc tạo một chỉ số 2dsphere:

db.collection.createIndex( { location : "2dsphere" } )

Tạo một chỉ số cho trường vị trí.

2D

2D là một loại hình học phẳng được sử dụng để tính khoảng cách giữa hai điểm như thể chúng ở trên một mặt phẳng. Ví dụ về việc tạo một chỉ số 2D:

db.collection.createIndex( { location : "2d" } )

Điều này tạo một chỉ số cho trường vị trí.

Loại Truy Vấn Địa Lý

Các truy vấn địa lý liên quan đến tính toán hình học. Dưới đây là các loại truy vấn được hỗ trợ bởi MongoDB:

  • $geoIntersects - Sử dụng để khớp các tài liệu với sự giao nhau của hình dạng hình học cụ thể.
  • $geoWithin - Khớp các tài liệu chứa trong một khu vực hình học cụ thể.
  • $near - Thường được sử dụng để truy vấn các tài liệu gần nhất với một điểm tọa độ cụ thể.

Ghi chú: Để biết thêm thông tin về truy vấn địa lý, vui lòng tham khảo các chương sau.