追記
- 2019/01/20
- https://github.com/go-mgo/mgo がもうメンテされてないそうので、サンプルでは、そのフォークである https://github.com/globalsign/mgo を使うようにしました。インターフェースは一緒です。
- Thanks to @NishidaRyu416
Go言語でも
mongodb使いたいじゃないですか.
The MongoDB driver for Go
とりあえず動く、まで
- mongodbのインストール
- 割愛(
brew install mongodb
?) - 個人的には
docker run -it -p 27017:27017 --rm mongo
がオススメです
- 割愛(
- Goのインストール
- 割愛(
brew install go
?)
- 割愛(
- mgoのインストール
- サンプルコード
mgoのインストール
おなじみのgo get
% go get -v github.com/globalsign/mgo
おしまい
サンプルコード
hoge.go
package main
import (
"fmt"
"log"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
)
type Person struct {
ID bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
Age int `bson:"age"`
}
func main() {
session, _ := mgo.Dial("mongodb://localhost/test")
defer session.Close()
db := session.DB("test")
/**
* つくるところ
**/
ritsu := &Person{
ID: bson.NewObjectId(),
Name: "田井中律",
Age: 17,
}
col := db.C("people")
if err := col.Insert(ritsu); err != nil {
log.Fatalln(err)
}
/**
* みつけるところ
**/
p := new(Person)
query := db.C("people").Find(bson.M{})
query.One(&p)
/**
* 結果
**/
fmt.Printf("%+v\n", p)
// &{ID:ObjectIdHex("5478517a9871b9b8e42e2ee2") Name:田井中律 Age:17}
}
おしまいです. コピペしてgo run hoge.go
してみてください.
以下、メモ
importのところ
import (
"fmt"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
)
structとmongo的なdocumentとのマッピングについて
type Person struct {
// encoding/jsonパッケージなどでおなじみの`tag`が使える
// `bson:"field_name"`で指定したフィールド名で
// mongodbのドキュメントが保存される
// また、取り出すときもこのフィールド名に対応したものがマッピングされる
ID bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
Age int `bson:"age"`
}
参考: http://godoc.org/labix.org/v2/mgo/bson
hostとのコネクションとか
func main() {
// sessionはコネクションプーリングとかよしなにしてくれる
session, _ := mgo.Dial("mongodb://localhost/test")
// お行儀
defer session.Close()
// データベース名でDatabaseを取得
db := session.DB("test")
参考: http://godoc.org/gopkg.in/mgo.v2#Session
Create系のメソッド
ritsu := &Person{
ID: bson.NewObjectId(),
Name: "田井中律",
Age: 17,
}
// コレクション名でCollectionを取得
col := db.C("people")
// Insertメソッドを使う
col.Insert(ritsu)
参考: http://godoc.org/gopkg.in/mgo.v2#Collection
Find系のメソッド
// 参照用のstructを用意
p := new(Person)
// mongoのコンソールで{}で表現するものは
// だいたい"bson.M{}"という形式で表現できる
// bson.M{"created": bson.M{"$lt": time.Now()}} とか
query := db.C("people").Find(bson.M{})
// 遅延評価なので、実行されてない。Queryはあとから追加できる
参考: http://godoc.org/gopkg.in/mgo.v2#Query
// ここでQueryが実行される
query.One(&p)
おわりです