챕터 소개

이 챕터에서는 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의 데이터 구조를 사용하여 다시 기술한 것입니다.