Giới thiệu chương

Chương này giới thiệu về các truy vấn không gian MongoDB của Golang, bao gồm cách lưu trữ thông tin vị trí và truy vấn theo khoảng cách.

Hướng dẫn trước

Gợi ý: Nếu bạn chưa quen với cú pháp truy vấn MongoDB, vui lòng đọc hướng dẫn MongoDB trước. Cú pháp biểu diễn được sử dụng để thao tác MongoDB trong Golang là giống nhau.

Chuẩn bị dữ liệu kiểm tra

Ghi một số dữ liệu chứa tọa độ địa lý vào bộ sưu tập coll. Trường location lưu trữ tọa độ vĩ độ và kinh độ của các cửa hàng.

docs := []interface{}{
	bson.D{
		{"title", "Gà Hấp Hải Nam"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.240015, 39.899617}}
		}},
	},
	bson.D{
		{"title", "Thịt Xá Xíu Quảng Đông"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.268854, 39.900276}}
		}},
	},
	bson.D{
		{"title", "Vịt Quay Quảng Đông"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.264905, 39.902778}}
		}},
	},
	bson.D{
		{"title", "Bánh Mì Xứ Shanxi"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.288938, 39.893164}}
		}},
	},
	bson.D{
		{"title", "Bánh Bao Hàng Châu"},
		{"location", bson.D{
			{"type": "Point"},
			{"coordinates": bson.A{116.286191, 39.910415}}
		}},
	}
}

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

Truy vấn theo khoảng cách

Sử dụng toán tử $near để thực hiện truy vấn theo khoảng cách. Giả sử bộ sưu tập coll lưu trữ dữ liệu cửa hàng và trường location lưu trữ tọa độ của mỗi cửa hàng, đoạn mã sau truy vấn cửa hàng gần nhất với tôi (khoảng cách tối thiểu 1000 mét, tối đa 5000 mét).

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}}}, // Tọa độ hiện tại của tôi
			{"$minDistance": 1000}, // Khoảng cách tối thiểu
			{"$maxDistance": 5000} // Khoảng cách tối đa
		}}
	}}}
)

Biểu diễn tương đương:

{
     location:
       { $near :
          {
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] }, // Tọa độ của tôi
            $minDistance: 1000, // Khoảng cách tối thiểu
            $maxDistance: 5000 // Khoảng cách tối đa
          }
       }
}

Biểu diễn này giống với biểu diễn nguyên bản của MongoDB, chỉ khác biệt ở cách mô tả lại bằng cấu trúc dữ liệu của Golang.