구형 연산자를 위해 거리를 라디안으로 변환하기
2D 인덱스는 구형 기하학을 사용하여 거리를 계산하는 특정 쿼리 연산자를 지원합니다. 구형 쿼리 연산자는 거리에 라디안을 사용합니다. 2D 인덱스와 함께 구형 쿼리 연산자를 사용하려면 거리를 라디안으로 변환해야 합니다.
2D 인덱스는 다음과 같은 구형 쿼리 연산자를 지원합니다:
spherical: true
옵션이 포함된$geoNear
파이프라인 단계
이 작업에 대하여
구형 데이터에 대한 쿼리에 2d 인덱스를 사용하면 잘못된 결과 또는 오류가 반환될 수 있습니다. 예를 들어 2D 인덱스는 극을 감싸는 구형 쿼리를 지원하지 않습니다.
데이터가 경도와 위도로 저장되어 있고 구형 표면에서 쿼리를 자주 실행하는 경우 2D 인덱스 대신 2DSphere 인덱스를 사용하세요.
경도와 위도 좌표를 지정할 때는 경도를 먼저 입력한 다음 위도를 입력합니다.
유효한 경도 값은
-180
~180
입니다(둘 모두 포함).유효한 위도 값은
-90
~90
입니다(둘 모두 포함).
절차
거리를 라디안으로 변환하려면 거리 측정과 동일한 단위로 거리를 구(예시: 지구)의 반경으로 나눕니다.
지구의 적도 반경은 약 3,963.2마일(6,378.1킬로미터)입니다.
예시
다음 예에서는 $centerSphere
연산자를 사용하여 쿼리를 수행합니다. $centerSphere
연산자는 라디안을 사용하여 거리를 계산합니다.
contacts
컬렉션을 생성합니다.
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
address
필드에는 레거시 좌표 쌍이 포함되어 있습니다.
마일을 라디안으로 변환
다음 쿼리는 중심점이 [ -72, 44 ]
이고 반경이 200마일인 원 내에 address
필드가 있는 문서를 반환합니다.
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ -72, 44 ] , 200 / 3963.2 ] } } } )
출력:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92d"), name: 'Georgine Lestaw', phone: '714-555-0107', address: [ -74, 44.74 ] } ]
이전 쿼리에서는 200마일을 라디안으로 변환하기 위해 지정된 마일을 3963.2로 나눴습니다.
킬로미터를 라디안으로 변환
다음 쿼리는 중심점이 [ 55, 42 ]
이고 반경이 500km인 원 내에 address
필드가 있는 문서를 반환합니다.
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ 55, 42 ] , 500 / 6378.1 ] } } } )
출력:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92c"), name: 'Evander Otylia', phone: '202-555-0193', address: [ 55.5, 42.3 ] } ]
이전 쿼리에서 500km를 라디안으로 변환하기 위해 지정된 킬로미터를 6378.1로 나누었습니다.