챕터 소개
이 챕터에서는 Golang MongoDB 지리적 쿼리를 소개합니다. 위치 정보를 저장하고 거리별로 쿼리하는 방법을 다룹니다.
사전 튜토리얼
팁: 만약 MongoDB 쿼리 구문에 익숙하지 않다면, 먼저 MongoDB 튜토리얼을 읽어보세요. Golang에서 MongoDB를 다룰 때 사용하는 표현 구문은 동일합니다.
테스트 데이터 준비
coll
컬렉션에 지리적 좌표를 포함하는 데이터를 작성합니다. location
필드에 각 상점의 위도와 경도 좌표를 저장합니다.
docs := []interface{}{
bson.D{
{"title", "해남 삶은 닭"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.240015, 39.899617}}
}},
},
bson.D{
{"title", "광동 바비큐 돼지고기"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.268854, 39.900276}}
}},
},
bson.D{
{"title", "광동 구운 거위"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.264905, 39.902778}}
}},
},
bson.D{
{"title", "산시 팬케이크"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.288938, 39.893164}}
}},
},
bson.D{
{"title", "항저우 만두"},
{"location", bson.D{
{"type": "Point"},
{"coordinates": bson.A{116.286191, 39.910415}}
}},
}
}
result, err := coll.InsertMany(context.Background(), docs)
거리별로 쿼리하기
거리 쿼리를 구현하기 위해 $near
연산자를 사용합니다. coll
컬렉션에 상점 데이터가 저장되어 있고, location
필드에 각 상점의 좌표가 저장되어 있다고 가정할 때, 다음 코드는 나에게 가장 가까운 상점을 조회합니다 (최소 거리 1000 미터, 최대 거리 5000 미터).
cursor, err := coll.Find(
context.Background(),
bson.D{{"location", bson.D{
{"$near": bson.D{
{"$geometry": bson.D{{"type":"Point"}, {"coordinates": bson.A{116.288938,39.893164}}}, // 내 현재 좌표
{"$minDistance": 1000}, // 최소 거리
{"$maxDistance": 5000} // 최대 거리
}}
}}}
)
동등한 표현:
{
location:
{ $near :
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, // 내 좌표
$minDistance: 1000, // 최소 거리
$maxDistance: 5000 // 최대 거리
}
}
}
표현은 원래의 MongoDB 표현과 동일하며, 유일한 차이점은 Golang의 데이터 구조를 사용하여 다시 기술한 것입니다.