章の紹介

この章では、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のデータ構造を使用して再度説明したことです。