2016-11-29 33 views
0

嘿,我試圖建立一個使用golang和mongodb的商店定位器。 我是新來的。我嘗試搜索,但無法找到golang中的代碼,它可以幫助我將商店名稱和座標插入到mongodb中,然後在提供的經度和緯度值的3000米範圍內搜索商店。storelocator與golang和mongodb

注意:我想自己提供身份證,以便我可以輕鬆地取得商店,如果我有身份證。

我試過下面給出,但什麼也沒有發生,在數據庫中沒有錯誤或存儲插入

test.go是如下:

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)) 
} 

回答

0

@ user7227958

看起來像圍棋由於(缺少)float64座標的精確度而與你玩弄技巧。

選中此項: with long:= 39.70 and lat:= 35.69您需要一個scope = 3000000來選擇您的記錄。 但是,如果您要使用更精確的座標,請說 long := 39.6910592 lat := 35.6909623 那麼即使在1米範圍內(預期),您也可以找到您的店鋪。

乾杯, -D