2016-11-29 3 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 точности ваших координат.

Проверьте это: с длинным: = 39,70 и lat: = 35,69 вам нужна область = 3000000 для вашей записи. Однако, если вы будете использовать более точные координаты, скажем long := 39.6910592 lat := 35.6909623 , тогда вы сможете найти свой магазин даже с объемом 1 метр (что ожидается).

Cheers, -D

 Смежные вопросы

  • Нет связанных вопросов^_^