はじめに
go言語でmongoDBにアクセスするためのライブラリにmgoがあります。mgo
でデータベースからfindしてくるときの処理について、書きたいと思います。
サンプル
サンプルとして以下のようなコードで2件データを挿入しておきます。
package main
import (
"log"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type Man struct {
Id bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
}
func main() {
session, err := mgo.Dial("mongodb://localhost/")
if err != nil {
log.Fatal(err)
}
defer session.Close()
c := session.DB("some-db-name").C("man")
if err := c.Insert(Man{
Id: bson.NewObjectId(),
Name: "Taro",
}, Man{
Id: bson.NewObjectId(),
Name: "Jiro",
}); err != nil {
log.Fatal(err)
}
}
全件取得
Find
メソッドにnil
あるいはbson.M{}
を渡すと全件取得できます。
var men []Man
if err := c.Find(nil).All(&men); err != nil {
log.Fatal(err)
}
spew.Dump(men)
/*
([]main.Man) (len=2 cap=2) {
(main.Man) {
Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc01"),
Name: (string) (len=4) "Taro"
},
(main.Man) {
Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc02"),
Name: (string) (len=4) "Jiro"
}
}
*/
絞り込み
上述のFind
メソッドに条件を指定できます。
以下のサイトに記載されているmongoのオペレータは同様に使えます。
https://docs.mongodb.org/manual/reference/operator/query/
//例 name が Taro か Hanako
var men []Man
if err := c.Find(bson.M{
"name": bson.M{
"$in": []string{"Taro", "Hanako"},
},
}).All(&men); err != nil {
log.Fatal(err)
}
ObjectIdで1件取得
"565edd868bc93d268a13bc02"
というようなId形式の文字列でfindするときは、ObjectId
型に変換しなければいけません。
bson.ObjectIdHex(string)
で変換するのですが、ObjectId
の形式の文字列ではない場合、panicします(panic: Invalid input to ObjectIdHex:)。
そのため、bson.IsObjectIdHex(string)
でチェックしてから変換するのが安全です。
idStr := "565edd868bc93d268a13bc02"
if !bson.IsObjectIdHex(idStr) {
log.Fatal("not objectId")
}
id := bson.ObjectIdHex(idStr)
var man Man
if err := c.FindId(id).One(&man); err != nil {
log.Fatal(err)
}
spew.Dump(man)
/*
(main.Man) {
Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc02"),
Name: (string) (len=4) "Jiro"
}
*/
注意として、FindId
でマッチするデータが存在しない場合、エラーとして返されます。
そのため、存在しない場合を別途処理するときは、以下のように記述する必要があります。
if err := c.FindId(id).One(&man); err != nil {
if err == mgo.ErrNotFound {
fmt.Println("Not found")
} else {
log.Fatal(err)
}
}