一架梯子,一头程序猿,仰望星空!
GoLang MongoDB教程 > 内容正文

Golang MongoDB地理信息查询


本章介绍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的数据结构重新描述一遍。