Sử dụng tính năng tìm kiếm không gian địa lý

Sử dụng các truy vấn không gian địa lý trong các thao tác tương thích với MongoDB để truy vấn những tài liệu nằm trong một phạm vi nhất định từ một kinh độ và vĩ độ cụ thể.

Trước khi bắt đầu

  1. Đảm bảo rằng bạn có quyền truy cập vào một cơ sở dữ liệu hoạt động tương thích với MongoDB hiện có hoặc Tạo cơ sở dữ liệu và kết nối với cơ sở dữ liệu đó.

  2. Đảm bảo rằng bạn có ít nhất một chỉ mục 2dsphere hoặc Tạo chỉ mục 2dsphere.

Đối tượng GeoJSON

Để chạy một truy vấn không gian địa lý đối với các trường trong bộ sưu tập của bạn, các trường mà bạn truy vấn phải là đối tượng GeoJSON hoặc GeoPoint.

Bạn có thể thực hiện một truy vấn không gian địa lý bằng cách sử dụng toán tử $near. Toán tử này sẽ tính toán khoảng cách của một điểm địa lý so với các điểm địa lý trong tài liệu. Sau đó, các tài liệu này sẽ được sắp xếp theo khoảng cách từ gần nhất đến xa nhất trong kết quả truy vấn. Bạn cũng có thể ghi đè thứ tự sắp xếp này bằng cách xác định một thứ tự sắp xếp phụ, khác với $natural, trong truy vấn của mình. Toán tử $near phải tồn tại trong một trường tài liệu trong bộ lọc truy vấn và phải chứa một trường GeoJSON $geometry.

Trong ví dụ sau, toán tử $near được dùng để tính khoảng cách giữa điểm địa lý (-122.084, 37.4221) và các điểm địa lý nằm trong trường location của tất cả các tài liệu trong myCollection.. Các tài liệu được trả về và sắp xếp theo khoảng cách gần nhất đến xa nhất giữa hai điểm.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Bạn cũng có thể sử dụng các trường $maxDistance$minDistance (không bắt buộc) để kiểm soát khoảng cách tính bằng mét từ điểm truy vấn của bạn. Ví dụ sau đây cho thấy một truy vấn trong đó các tài liệu được trả về phải cách điểm (-122.084, 37.4221) ít nhất 500 mét và nhiều nhất 2.000 mét:

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

Nếu chỉ mục của bạn được phân vùng, thì bạn có thể lọc dựa trên phân vùng bằng cách đưa phân vùng vào bộ lọc bình đẳng "và" trong truy vấn. Ví dụ: nếu có một phân vùng region và muốn lọc kết quả truy vấn theo khu vực midwest, bạn có thể làm như sau:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

Giá trị của phân vùng phải là một chuỗi. Bộ lọc phân vùng phải được kết hợp với cụm từ tìm kiếm bằng toán tử $and.

Hạn chế

  • Bạn không thể dùng toán tử $near và toán tử $text trong cùng một truy vấn.
  • $near không thể được lồng trong câu lệnh $or có nhiều mệnh đề, trừ phi $near là biểu thức duy nhất trong mệnh đề $or.
  • Bạn không thể dùng $near với toán tử $not hoặc $nor trong một truy vấn.
  • $near không được hỗ trợ trong các truy vấn tổng hợp.