Введение

Эта глава посвящена геопространственным запросам MongoDB в Golang, включая способы хранения информации о местоположении и выполнения запросов по расстоянию.

Учебные пособия для предварительной подготовки

Совет: Если вы не знакомы с синтаксисом запросов в MongoDB, пожалуйста, сначала ознакомьтесь с учебником по MongoDB. Синтаксис выражений, используемый для работы с MongoDB в Golang, такой же.

Подготовка тестовых данных

Запишите некоторые данные, содержащие географические координаты, в коллекцию 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 для его повторного описания.