go-mongoでの基本操作


一部の機能を実装するのにgolangを利用することになり、DBはMongoDBだったので、以下のライブラリを使うことにしました。

garyburd/go-mongo – GitHub

もう一つ、gomongo(名前が紛らわしい)というのもあるそうですが、こっちは現リリース版のgolangだとコンパイルが通らなかったので、とりあえず、上記のものを利用しました。

githubのREADMEに情報が少なかったので、メモとして基本的な操作方法について記載しておきます。

基本操作

接続、コレクションの選択、切断

// 接続
conn, err := mongo.Dial("localhost:27017")
// コレクションの選択
c := mongo.Collection{conn, "hoge.foocollections", mongo.DefaultLastErrorCmd}
// 切断
conn.Close()

SELECT

// 単数
// 値をマップに格納
var foo_map mongo.M
err := c.Find(nil).One(&foo_map)
log.Println(foo_map["_id"])
 
// 値を構造体に格納
type Foo struct {
    Id mongo.ObjectId `bson:"_id"`
    Name string `bson:"name"`
}
 
var foo Foo
err := c.Find(nil).One(&foo)
log.Println(foo.Id)
 
// 複数
cursor, err := c.Find(nil).Limit(10).Cursor()
for cursor.HasNext() {
    var f Foo
    err = cursor.Next(&f)
    log.Println(f)
}

INSERT

id := mongo.NewObjectId()
err = c.Insert(&Foo{Id: id, Name: "Tatsuya Fukata"})

UPDATE

// 引数: 検索条件, 更新情報
err = c.Update(mongo.M{"name": "Tatsuya Fukata"}, mongo.M{"name": "深田達也"})

DELETE

err = c.Remove(mongo.M{"name": "深田達也"})

BSONとGolangの変換表

go-mongoではBSONからgolang内の型変換は下記のようになっています。

//      BSON                -> Go
//      Integer32           -> signed and unsigned integers, floats, bool
//      Integer64           -> signed and unsigned integers, floats, bool
//      Array               -> []interface{}, other slice types
//      Binary              -> []byte
//      Boolean             -> bool
//      Datetime            -> mongo.Datetime, int64
//      Document            -> map[string]interface{}, struct types
//      Double              -> signed and unsigned integers, floats, bool
//      MinValue, MaxValue  -> mongo.MinMax
//      ObjectID            -> mongo.ObjectId
//      Symbol              -> mongo.Symbol, string
//      Timestamp           -> mongo.Timestamp, int64
//      string              -> string

後でmasterブランチのテストコードを見てみると上記の方法ではなく、Queryに対してUpdateやRemoveメソッドが使えるようになっていたので、今後はメソッドチェインで検索条件を構築した後に、操作が行えるようにもなるみたいです。

これは、goinstallでインストールされるバージョンにはまだ含まれていません。

関連記事