Chương này giới thiệu về truy vấn địa lý của MongoDB, hỗ trợ truy vấn giao nhau và chứa hình học.

Các kịch bản ứng dụng:

  • Vẽ một vòng tròn trên bản đồ và truy vấn dữ liệu nằm trong vòng tròn đó.

Hướng dẫn tiên quyết

Định dạng Lưu trữ Dữ liệu Địa lý cho MongoDB

Các yêu cầu tiên quyết cho việc truy vấn dữ liệu dựa trên khoảng cách như sau:

  • Mỗi dữ liệu tài liệu chứa một trường để lưu trữ dữ liệu tọa độ, ví dụ: trường vị trí lưu trữ tọa độ của một cửa hàng.
  • Tạo chỉ mục không gian 2dsphere hoặc 2d.

Toán tử $geoWithin

Nó thường được sử dụng để truy vấn các điểm tọa độ chứa trong một phạm vi hình học cụ thể, ví dụ: khi tìm kiếm nhà bằng cách vẽ trên bản đồ, vẽ một khu vực trên bản đồ và truy vấn các nhà trong khu vực đó.

Định dạng cú pháp:

{
   <trường vị trí>: { // Trường truy vấn
      $geoWithin: {
         $geometry: {
            type:  , // Chỉ hỗ trợ đa giác đơn hoặc MultiPolygon.
            coordinates: [ <tọa độ> ]  // Bộ sưu tập điểm tọa độ hình học
         }
      }
   }
}

Ví dụ:

db.places.find(
   {
     loc: { // Trường loc lưu trữ dữ liệu tọa độ
       $geoWithin: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // Tìm dữ liệu trong khu vực hình học này
          }
       }
     }
   }
)

Truy vấn các dữ liệu tài liệu trong khu vực hình học cụ thể trong bộ sưu tập places.

Toán tử $geoIntersects

Sự khác biệt so với $geoWithin là $geoIntersects được sử dụng để xác định xem có sự giao nhau giữa hai hình học hay không.

Định dạng:

{
  <trường vị trí>: { // Trường lưu trữ điểm tọa độ hình học
     $geoIntersects: {
        $geometry: {
           type: "<loại đối tượng geojson>" , // Loại hình học
           coordinates: [ <tọa độ> ] // Bộ sưu tập điểm tọa độ hình học, truy vấn dữ liệu giao nhau với hình học này
        }
     }
  }
}

Ví dụ:

db.places.find(
   {
     loc: { // Trường loc lưu trữ dữ liệu khu vực, là một hình dạng hình học
       $geoIntersects: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // Truy vấn dữ liệu giao nhau với hình học này
             ]
          }
       }
     }
   }
)