LoginSignup
11
9

More than 5 years have passed since last update.

goのmgoでfindするときの処理

Posted at

はじめに

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)
        }
    }

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9