다음을 통해 공유


지리 공간적 쿼리 지원

적용 대상: MongoDB vCore

이제 vCore 기반 Azure Cosmos DB for MongoDB를 사용하여 공간 데이터를 저장하고 쿼리할 수 있습니다. 이러한 향상된 기능은 공간 데이터를 관리하고 분석하는 강력한 도구를 제공하여 실시간 위치 추적, 경로 최적화, 공간 분석과 같은 광범위한 애플리케이션을 구현할 수 있습니다.

이제 지원되는 지리 공간적 명령 및 연산자에 대한 간략한 개요는 다음과 같습니다.

지리 공간적 쿼리 연산자

$geoIntersects

지정된 기하 구조가 문서의 기하 구조와 교차하는 문서를 선택합니다. 지정된 기하 구조와 공간의 일부를 공유하는 문서를 찾는 데 유용합니다.

   db.collection.find({
       location: {
           $geoIntersects: {
               $geometry: {
                   type: "<GeoJSON object type>",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$geoWithin

지정된 모양 내에 완전히 존재하는 지리 공간적 데이터가 있는 문서를 선택합니다. 이 연산자는 정의된 영역 내에서 문서를 찾는 데 사용됩니다.

   db.collection.find({
       location: {
           $geoWithin: {
               $geometry: {
                   type: "Polygon",
                   coordinates: [[[...], [...], [...], [...]]]
               }
           }
       }
   })

$box

두 개의 좌표 쌍(왼쪽 하단과 오른쪽 상단 모서리)을 사용하여 직사각형 영역을 정의합니다. $geoWithin 연산자와 함께 사용하여 이 사각형 내에서 문서를 찾습니다. 예를 들어, 맵의 직사각형 영역 내에 있는 모든 위치를 찾는 것입니다.

  db.collection.find({
      location: {
          $geoWithin: {
              $box: [[lowerLeftLong, lowerLeftLat], [upperRightLong, upperRightLat]]
          }
      }
  })

$center

중심점과 반지름(라디안)을 사용하여 원형 영역을 정의합니다. $geoWithin 연산자와 함께 사용하여 이 원 안에서 문서를 찾습니다.

  db.collection.find({
      location: {
          $geoWithin: {
              $center: [[longitude, latitude], radius]
          }
      }
  })

$centerSphere

$center와 유사하지만 중심점과 반지름(라디안)을 사용하여 구형 영역을 정의합니다. 구형 기하 계산에 유용합니다.

  db.collection.find({
      location: {
          $geoWithin: {
              $centerSphere: [[longitude, latitude], radius]
          }
      }
  })

$geometry

GeoJSON 개체를 지정하여 기하 도형을 정의합니다. 복잡한 모양에 기반한 쿼리를 수행하기 위해 지리 공간적 연산자와 함께 사용됩니다.

  db.collection.find({
      location: {
          $geoIntersects: {
              $geometry: {
                  type: "<GeoJSON object type>",
                  coordinates: [longitude, latitude]
              }
          }
      }
  })

$maxDistance

지리 공간적 쿼리에 대한 지점으로부터의 최대 거리를 지정합니다. $near$nearSphere 연산자와 함께 사용됩니다. 예를 들어, 지정된 지점으로부터 2km 이내에 있는 모든 위치를 찾는 것입니다.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $maxDistance: distance
          }
      }
  })

$minDistance

지리 공간적 쿼리에 대한 지점으로부터의 최소 거리를 지정합니다. $near$nearSphere 연산자와 함께 사용됩니다.

  db.collection.find({
      location: {
          $near: {
              $geometry: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              $minDistance: distance
          }
      }
  })

$polygon

좌표 쌍의 배열을 사용하여 다각형을 정의합니다. $geoWithin 연산자와 함께 사용하여 이 다각형 내에서 문서를 찾습니다.

  db.collection.find({
      location: {
          $geoWithin: {
              $geometry: {
                  type: "Polygon",
                  coordinates: [[[...], [...], [...], [...]]]
              }
          }
      }
  })

$near

지정된 지점 근처에 있는 문서를 찾습니다. 해당 지점으로부터의 거리를 기준으로 정렬된 문서를 반환합니다. 예를 들어, 사용자의 위치에서 가장 가까운 레스토랑을 찾는 것입니다.

    db.collection.find({
        location: {
            $near: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

$nearSphere

$near와 유사하지만 구면에서 계산을 수행합니다. 지구 표면에서 더 정확한 거리를 계산하는 데 유용합니다.

    db.collection.find({
        location: {
            $nearSphere: {
                $geometry: {
                    type: "Point",
                    coordinates: [longitude, latitude]
                },
                $maxDistance: distance
            }
        }
    })

지리 공간적 집계 단계

$geoNear

지정된 지점으로부터의 거리를 기준으로 정렬된 문서를 반환하기 위해 지리 공간적 쿼리를 수행합니다. 추가 쿼리 기준과 반환 거리 정보를 포함할 수 있습니다.

  db.collection.aggregate([
      {
          $geoNear: {
              near: {
                  type: "Point",
                  coordinates: [longitude, latitude]
              },
              distanceField: "distance",
              spherical: true
          }
      }
  ])

고려 사항 및 지원되지 않는 기능

  • 현재, 면적이 단일 반구를 초과하는 단일 링 GeoJSON 다각형에 대한 쿼리는 지원되지 않습니다. 이러한 경우 Mongo vCore는 다음과 같은 오류 메시지를 반환합니다.

    Error: Custom CRS for big polygon is not supported yet.
    
  • 일반 인덱스와 지리 공간적 인덱스를 사용하는 복합 인덱스는 허용되지 않습니다. 예시:

    db.collection.createIndex({a: "2d", b: 1});
    Error: Compound 2d indexes are not supported yet
    
  • 구멍이 있는 다각형은 현재 $geoWithin 쿼리와 함께 사용할 수 없습니다. 구멍이 있는 다각형을 삽입하는 것은 제한이 없지만 결국 다음과 같은 오류 메시지와 함께 실패합니다.

    Error: $geoWithin currently doesn't support polygons with holes
    
  • $geoNear 집계 단계에서는 키 필드가 항상 필요합니다. 키 필드가 누락된 경우 다음 오류가 발생합니다.

    Error: $geoNear requires a 'key' option as a String
    
  • $geoNear, $near, $nearSphere 단계에는 엄격한 인덱스 요구 사항이 없으므로 인덱스가 누락되어도 이러한 쿼리는 실패하지 않습니다.