下了最新版的Mongodb3.2,下了mongodb的PHP驱动。
PHP的版本是php7,PHP的操作mongodb的类文件,结果尼玛的,提示Mongo类不存在,不知道是不是驱动下载的不是最新版的事。
看官网:https://docs.mongodb.com/ecosystem/drivers/driver-compatibility-reference/#reference-compatibility-mongodb-php
https://pecl.php.net/package/mongodb
In the table below, mongodb and mongo refer to the new and legacy MongoDB PHP driver, respectively.PHPLIB refers to the userland library.
PHP Driver | MongoDB 2.4 | MongoDB 2.6 | MongoDB 3.0 | MongoDB 3.2 |
---|---|---|---|---|
PHPLIB 1.0 + mongodb-1.1 | ✓ | ✓ | ✓ | ✓ |
mongodb-1.1 | ✓ | ✓ | ✓ | ✓ |
mongodb-1.0 | ✓ | ✓ | ✓ | |
mongo-1.6 | ✓ | ✓ | ✓ | |
mongo-1.5 | ✓ | ✓ | ||
mongo-1.4 | ✓ | ✓ | ||
mongo-1.3 | ✓ |
The driver does not support older versions of MongoDB.
|
既然PHP不行,那就用Golang,用golang做个web api吧,反正最近Golang特热门的。
搜索下Mongodb的golang驱动,不少人推荐mgo的,那就随大众吧,去github上搜了mgo,安装下载。
github地址:https://github.com/go-mgo/mgo
官网地址:http://labix.org/mgo
安装地址:go get gopkg.in/mgo.v2
API文档地址:https://godoc.org/gopkg.in/mgo.v2
官网提供的demo:
package main import ( "fmt" "log" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) type Person struct { Name string Phone string } func main() { session, err := mgo.Dial("server1.example.com,server2.example.com") if err != nil { panic(err) } defer session.Close() // Optional. Switch the session to a monotonic behavior. session.SetMode(mgo.Monotonic, true) c := session.DB("test").C("people") err = c.Insert(&Person{"Ale", "+55 53 8116 9639"}, &Person{"Cla", "+55 53 8402 8510"}) if err != nil { log.Fatal(err) } result := Person{} err = c.Find(bson.M{"name": "Ale"}).One(&result) if err != nil { log.Fatal(err) } fmt.Println("Phone:", result.Phone) }
简单加easy的,安装跑demo,完毕。
mongodb的Command的文档地址:
https://docs.mongodb.com/manual/reference/command/
大约要实现的功能是,插入一定数量的经纬度坐标点,然后根据根据指定的经纬度查询附近一定距离内的坐标点。
上个栗子:
package main /** @author 908204694@qq.com */ import ( "fmt" "log" "net/http" "reflect" "strings" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" ) const MONGO_URL = "localhost:27017" type LocS struct { Type string `bson:"type"` Coordinates [2]float32 `bson:"Coordinates"` } type Point struct { Loc LocS `bson:"loc"` Name string `bson:"name"` } /** 注意 索引要设置成 2dsphere db.lbsplace.ensureIndex( { loc: "2dsphere" } ) */ // 接收web form中送过来的坐标点 // 暂时是使用的固定值。 // 添加坐标点 func addPoint(w http.ResponseWriter, r *http.Request) { // 解析参数, 默认是不会解析的 r.ParseForm() loc := LocS{"Point", [2]float32{12.33, 44.55}} point := Point{loc, "一号店"} session, err := mgo.Dial(MONGO_URL) if err != nil { panic(err) } defer session.Close() // Optional. Switch the session to a monotonic behavior. session.SetMode(mgo.Monotonic, true) // database->collection c := session.DB("lbs").C("lbsplace") err = c.Insert(&point) if err != nil { log.Fatal(err) } } // 接收web form中送过来的坐标点 // 暂时是使用的固定值。 // 查询附近,打印查询结果 func showPoint(w http.ResponseWriter, r *http.Request) { r.ParseForm() session, err := mgo.Dial(MONGO_URL) if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) db := session.DB("lbs") // 看了下源码,返回值必须是 reflect.Ptr 或者 reflect.Map ,否则返回error或者nil。 // 就这么一个返回值的,浪费我好长时间,以为是command写的有问题的,。。。官网的文档写的不太详细 result := bson.M{} errRun := db.Run( bson.D{ {"geoNear", "lbsplace"}, {"spherical", true}, {"near", [2]float64{ 118.19079, 35.677136}}, {"num", 2}}, &result) fmt.Println("result:", result, errRun) } func sayHello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello!\n") } func main() { // 设置访问的路由 http.HandleFunc("/", sayHello) http.HandleFunc("/addpoint", addPoint) http.HandleFunc("/showpoint", showPoint) // 设置监听的端口 err := http.ListenAndServe(":9090", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }
有疑问加站长微信联系(非本文作者)