Wprowadzenie

Ten rozdział przedstawia zapytania przestrzenne MongoDB w Golang, w tym sposób przechowywania informacji o lokalizacji i zapytania według odległości.

Tutoriale Wymagane

Wskazówka: Jeśli nie jesteś zaznajomiony z syntaktyką zapytań MongoDB, przeczytaj najpierw tutorial MongoDB. Składnia używana do operowania MongoDB w Golang jest taka sama.

Przygotowanie Danych Testowych

Wprowadź dane zawierające współrzędne geograficzne do kolekcji coll. Pole location przechowuje współrzędne geograficzne sklepów.

docs := []interface{}{
	bson.D{
		{"title", "Chińskie Gotowane Kurczę"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.240015, 39.899617}}
		}},
	},
	bson.D{
		{"title", "Chińskie BBQ wieprzowe"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.268854, 39.900276}}
		}},
	},
	bson.D{
		{"title", "Chińska pieczona gęś"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.264905, 39.902778}}
		}},
	},
	bson.D{
		{"title", "Chiński placek z Shaanxi"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.288938, 39.893164}}
		}},
	},
	bson.D{
		{"title", "Chińskie pierogi z Hangzhou"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.286191, 39.910415}}
		}},
	}
}

result, err := coll.InsertMany(context.Background(), docs)

Zapytanie Według Odległości

Użyj operatora $near, aby zaimplementować zapytanie odległości. Zakładając, że kolekcja coll przechowuje dane sklepowe, a pole location przechowuje współrzędne każdego sklepu, poniższy kod zapytuje najbliższy sklep (minimalna odległość 1000 metrów, maksymalna odległość 5000 metrów) od mnie.

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}}}, // Moje aktualne współrzędne
			{"$minDistance": 1000}, // Minimalna odległość
			{"$maxDistance": 5000} // Maksymalna odległość
		}}
	}}}
)

Odpowiednik wyrażenia:

{
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] }, // Moje współrzędne
            $minDistance: 1000, // Minimalna odległość
            $maxDistance: 5000 // Maksymalna odległość
          }
       }
}

Wyrażenie jest takie samo jak natywne wyrażenie MongoDB, jedyna różnica polega na ponownym opisaniu go przy użyciu struktury danych w Golangu.