MongoDB 지리공간 기능을 구현하는 방법

Mongodb Jiligong Gan Gineung Eul Guhyeonhaneun Bangbeob



MongoDB의 지리공간 기능은 지리 데이터를 데이터베이스에 저장하는 간단한 방법을 제공합니다. 기본적으로 지리공간 데이터를 MongoDB에 GeoJSON 객체로 저장할 수 있습니다. GeoJSON은 간단한 지리 데이터를 포함하는 JavaScript 객체 표기법을 사용하는 무료 오픈 소스 형식입니다. 이 기능은 위치 검색을 기반으로 한 매핑 프로세스 등 위치 기반 서비스가 필요한 앱에 중요합니다. 이 문서에서는 예제 구현을 통해 지리공간 기능을 다룹니다.

지리 공간적 기능에 대한 컬렉션에 문서 추가

MongoDB 지리공간 기능의 기능을 시연하려면 특정 컬렉션에 대한 문서가 필요합니다. 다음과 같이 '영역' 컬렉션에 몇 가지 문서를 삽입합니다.

db.area.insertMany( [
{
이름: '어린이공원' ,
위치: { 유형: '가리키다' , 좌표: [ - 60.97 , 30.77 ] },
범주: '정원'
},
{
이름: '학생 구역' ,
위치: { 유형: '가리키다' , 좌표: [ - 60.9928 , 30.7193 ] },
범주: '정원'
},
{
이름: '축구장' ,
위치: { 유형: '가리키다' , 좌표: [ - 60.9375 , 30.8303 ] },
범주: '경기장'
}
] )

좌표 등의 위치 데이터가 포함된 문서가 있습니다. 또한 지리공간 쿼리의 성능을 최적화하기 위해 현장에 지리공간 색인을 생성합니다.









예 1: $geoIntersects 쿼리 연산자 사용

먼저, 제공된 객체와 교차하는 지리공간 기능의 $geoIntersects 연산자가 있습니다. $geoIntersects 연산자의 다음 구현을 고려해보세요.



db.area.find({ 위치: { $geoIntersects: { $geometry: { 유형: '가리키다' ,

좌표: [ - 60.97 , 30.77 ] } } } })

예제에서는 '찾기' 작업과 함께 '영역' 컬렉션을 호출합니다. find() 메소드에 '위치' 필드 세트를 지리공간 기능의 $geoIntersects 쿼리 연산자에 전달합니다. 지정된 점이 기하학 필드에 저장된 기하학과 교차하는지 확인하는 데 사용됩니다.





그런 다음 $geoIntesects 연산자는 유형 필드가 '점' 값으로 설정되고 좌표 필드가 '좌표' 값으로 제공되는 $geometry 연산자를 사용합니다. 여기서 $geometry는 지리공간 비교를 위해 정의됩니다.

다음 출력은 예상 문서가 검색되는 위치이며 기하학 필드에 지정된 점과 교차하는 기하학적 객체가 포함되어 있는 위치입니다.



예 2: $near 쿼리 연산자 사용

$near 연산자는 지정된 장소에 지리적으로 가까운 문서를 식별하기 위해 지리공간 쿼리를 수행하는 데 사용되는 지리공간 기능이기도 합니다. 지정된 위치에 대한 근접성에 따라 정렬된 문서를 검색합니다. 여기서는 $near 연산자의 구현을 제공합니다.

db.area.find(
{
위치:
{ $근처:
{
$기하학: { 유형: '가리키다' ,  좌표: [ - 60.9667 , 30.78 ] },
$min거리: 1000 ,
$max거리: 5000
}
}
}
)

예제에서는 '찾기' 작업 내에서 '영역' 컬렉션의 '위치' 필드를 정의합니다. 그런 다음 지리 공간적 기능의 $near 쿼리 연산자를 해당 '위치' 필드로 설정합니다. $near 연산자는 주어진 좌표점으로 가까운 지점을 검색합니다. 다음으로, 특정 지점에서 지정된 거리 범위 내의 문서를 검색하기 위해 특정 값과 함께 제공되는 $near 연산자의 $minDistance 및 $maxDistance 매개 변수를 사용합니다.

문서는 지리 공간적 '영역' 컬렉션의 지정된 위치 또는 관심 지점 근처에 있는 출력에서 ​​검색됩니다.

예제 3: $nearsphere 쿼리 연산자 사용

또는 $near 연산자와 유사한 $nearsphere 연산자가 있지만 $nearSphere는 거리를 계산할 때 지구의 구형 모양을 고려합니다.

db.area.find(
{
위치: {
$nearSphere: {
$기하학: {
유형 : '가리키다' ,
좌표 : [ - 60.9667 , 30.78 ]
},
$min거리: 1000 ,
$max거리: 5000
}
}
}
)

이 예에서는 지리 공간 쿼리의 $nearsphere 연산자를 사용합니다. 여기서 $nearspehere 연산자는 가장 가까운 점이 쿼리에 지정된 점과 가깝고 해당 점이 좌표 필드 배열로 설정된 문서를 검색합니다.

그런 다음 $minDistance 및 $maxDistance 매개변수를 설정하여 결과를 구체화합니다. $minDistance 매개변수는 반환된 문서가 지정된 지점에서 최소 1000미터 떨어져 있는지 확인하는 반면, $maxDistance 매개변수는 5000미터 이내의 위치로 결과를 제한합니다.

문서는 주어진 좌표가 있는 지점에서 지정된 미터 내의 위치로 출력에 표시됩니다.

예 4: $geoWithin 쿼리 연산자 사용

다음으로 MongoDB에는 원과 같은 지정된 모양 내에 완전히 포함된 문서를 찾기 위한 지리 공간 쿼리에 사용되는 $geoWithin 연산자가 있습니다. $geoWithin 쿼리에 대한 다음 데모를 살펴보겠습니다.

db.area.find({ 위치:

{ $geo내부:

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

이 예에서는 $geoWithin 연산자를 사용하여 2D 구의 특정 원형 영역 내에서 'area' 컬렉션의 문서를 찾습니다. 이를 위해 $geoWithin 연산자 내부에 $centerSphere 연산자를 지정합니다. 이 연산자는 두 인수를 중심점(여기서는 좌표점을 나타낼 가능성이 높음)과 거리 값(마일 단위)을 나타내는 원의 반경으로 사용합니다.

결과 문서는 주어진 중심점과 약 3마일의 반경으로 정의된 원 내에 속하는 지리공간적 지점을 나타내는 다음에서 검색됩니다.

예 5: $geoNear 쿼리 연산자 사용

또한 $geoNear 연산자는 집계 파이프라인에 사용되는 지리공간 연산자이기도 합니다. 지리공간 쿼리를 수행하고 지정된 지점에 대한 근접성을 기준으로 정렬된 문서를 반환합니다. 여기서는 집계 파이프라인 내부에서 호출되는 $geoNear 연산자를 제공했습니다.

db.area.aggregate([
{
$geoNear: {
근처: { 유형: '가리키다' , 좌표: [ - 60.99279 , 30.719296 ] },
거리 필드: '거리 계산' ,
최대거리: 2 ,
쿼리: { 카테고리: '정원' },
includeLocs: '거리.위치' ,
구형: 사실
}
}
])

예제에서는 MongoDB의 집계 메서드를 호출하고 그 안에 $geoNear 연산자를 정의합니다. $geoNear 연산자는 쿼리 동작을 지정하기 위해 여러 매개변수로 설정됩니다. 먼저 '좌표' 값을 검색 기준점으로 제공하는 'near' 매개변수를 설정합니다.

그런 다음 'distanceField' 매개변수를 활용하여 제공된 필드를 결과 필드로 지정합니다. 이 설정된 결과 필드는 각 문서와 참조점 사이의 거리를 저장합니다. 다음으로, 최대 거리를 미터 단위로 나타내는 '2' 값으로 'maxDistance' 매개변수를 정의합니다.

그 다음에는 '카테고리' 필드를 기준으로 문서를 필터링하고 '카테고리'가 '공원'인 문서만 고려하는 '쿼리' 매개변수가 있습니다. 그런 다음 'includeLocs' 매개변수를 호출하여 위치 정보를 포함합니다. 마지막으로 2D 구형 좌표계를 사용하여 거리를 계산하는 'true' 값으로 '구형' 매개변수를 지정합니다.

집계 파이프라인은 그에 따라 매개변수에 대한 정보를 표시하는 출력의 문서를 나타냅니다. 다음 'dist.calculated' 필드는 참조점에서 각 문서까지의 거리를 표시합니다.

결론

우리는 MongoDB의 지리 공간적 기능이 위치 기반 정보를 효율적으로 처리하고 쿼리하는 데 도움이 된다는 것을 알게 되었습니다. 예제 프로그램을 통해 다양한 연산자를 사용하여 공간정보 기능의 구현을 배웠습니다. 우리는 다양한 응용 분야에 도움이 되는 더 많은 기능과 방법을 보유하고 있습니다.