mgo.v2でGoからMongoDBにつないでSELECTする

導入方法 https://gopkg.in/mgo.v2

データは事前に下記のように入っているとする

> db.users.find()
{ "_id" : ObjectId("57a08bcd665449ed6ba92517"), "name" : "あいう", "id" : 2 }
{ "_id" : ObjectId("57a08bd8665449ed6ba92518"), "name" : "かきく", "id" : 1 }
package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type User struct {
    Name  string        `bson:"name"`
    Id int `bson:"id"`
}

func main() {
    session, _ := mgo.Dial("mongodb://localhost")
    defer session.Close()
    db := session.DB("mydb")

    // 全ユーザ取得
    // var results []User
    // db.C("users").Find(nil).All(&results)
    // fmt.Println("Results All: ", results) 

    // id指定でユーザ取得
    var results []User
    db.C("users").Find(bson.M{"id": 1}).All(&results)
    fmt.Println("Results of one user: ", results)    
}

Go+echoにURLパラメータでユーザIDを入れてMongoDBから引く

URLパラメータでidを取得したが、その型がstringなのでintに変換してからFindする必要があった。http://localhost:1323/users/id/2 このようにアクセスするとIDに従ったユーザの名前が表示できる。

package main

import (
    // サーバ系
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"

    // mongo系
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"

    // 型
    "strconv"
    //"reflect"
)

// ユーザクラス
type User struct {
    Name  string `bson:"name"`
    Id int `bson:"id"`
}

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })

    // :id, :name に値が入っていないとNot Foundになる
    e.GET("/users/id/:id", func(c echo.Context) error {

      // 数値に変換する必要あり
      var id int
      id, _ = strconv.Atoi(c.Param("id"))

      //idでDBを引く
      session, _ := mgo.Dial("mongodb://localhost")
        defer session.Close()
      db := session.DB("mydb")

        // id指定でユーザ取得
        var results []User
        fmt.Println(id)    
        db.C("users").Find(bson.M{"id": id}).All(&results)
         
        fmt.Println("Results of one user: ", results)
        fmt.Println(len(results))    

        if len(results) == 0 {
            return c.String(http.StatusOK, "No user")
        }else{
            name := results[0].Name
            return c.String(http.StatusOK, "Hello, " + name)
        }
    })

    e.POST("/user", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, POST user")
    })

    // ポート
    e.Run(standard.New(":1323"))
}