带有golang和mongodb的storelocator
嘿,我正在尝试使用golang和mongodb构建一个商店定位器。 我对两者都是新手。我尝试搜索,但在golang中找不到代码,该代码可以帮助我将带有名称和坐标的商店插入mongodb,然后在提供的经纬度值的3000米半径范围内搜索商店 注意:我想自己提供id,这样如果我有id,我就可以很容易地拿到商店 我尝试如下所示,但没有发生任何事情,没有错误,也没有在db中插入存储 test.go如下所示:带有golang和mongodb的storelocator,mongodb,go,geolocation,mgo,Mongodb,Go,Geolocation,Mgo,嘿,我正在尝试使用golang和mongodb构建一个商店定位器。 我对两者都是新手。我尝试搜索,但在golang中找不到代码,该代码可以帮助我将带有名称和坐标的商店插入mongodb,然后在提供的经纬度值的3000米半径范围内搜索商店 注意:我想自己提供id,这样如果我有id,我就可以很容易地拿到商店 我尝试如下所示,但没有发生任何事情,没有错误,也没有在db中插入存储 test.go如下所示: package main import ( "encoding/json" "f
package main
import (
"encoding/json"
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"log"
)
type Store struct {
ID string `bson:"_id,omitempty" json:"shopid"`
Name string `bson:"name" json:"name"`
Location GeoJson `bson:"location" json:"location"`
}
type GeoJson struct {
Type string `json:"-"`
Coordinates []float64 `json:"coordinates"`
}
func main() {
cluster := "localhost" // mongodb host
// connect to mongo
session, err := mgo.Dial(cluster)
if err != nil {
log.Fatal("could not connect to db: ", err)
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
// search criteria
long := 39.70
lat := 35.69
scope := 3000 // max distance in metres
var results []Store // to hold the results
// query the database
c := session.DB("test").C("stores")
// insert
man := Store{}
man.ID = "1"
man.Name = "vinka medical store"
man.Location.Type = "Point"
man.Location.Coordinates = []float64{lat, long}
// insert
err = c.Insert(man)
fmt.Printf("%v\n", man)
if err != nil {
fmt.Println("There is insert error")
panic(err)
}
// ensure
// Creating the indexes
index := mgo.Index{
Key: []string{"$2dsphere:location"},
Bits: 26,
}
err = c.EnsureIndex(index)
if err != nil {
fmt.Println("There is index error")
panic(err)
}
//find
err = c.Find(bson.M{
"location": bson.M{
"$nearSphere": bson.M{
"$geometry": bson.M{
"type": "Point",
"coordinates": []float64{long, lat},
},
"$maxDistance": scope,
},
},
}).All(&results)
//err = c.Find(bson.M{"_id": "1"}).All(&results)
if err != nil {
panic(err)
}
//convert it to JSON so it can be displayed
formatter := json.MarshalIndent
response, err := formatter(results, " ", " ")
fmt.Println(string(response))
}
@用户7227958
由于坐标的精确性(缺乏),Go似乎在和你玩把戏
选中此项:
对于long:=39.70和lat:=35.69,您需要一个范围=3000000才能选择记录。
但是如果你使用更精确的坐标,比如
长:=39.6910592
纬度:=35.6909623
然后,即使在1米的范围内(这是预期的),您也可以找到您的店铺
干杯,
-D