mongoDBをGoで操作するときのメモ

MongoDBのライブラリ

  • 以前はmgoというライブラリが主流だったようです
    • 最初にググったときにmgoの記事が見つかったので、ちょっと混乱しました。
  • 現状だとmongo-go-driverらしいです github.com

Mongoの接続

  • import
import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)
  • 接続
    connectionURI := fmt.Sprintf(
        "mongodb://%s:%s@%s",
        "username",
        "password",
        "mongodbendpoint:27017",
    )

    client, err := mongo.NewClient(options.Client().ApplyURI(connectionURI))
    if err != nil {
        return err
    }

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    err = client.Connect(ctx)
    if err != nil {
        return err
    }

    err = client.Ping(ctx, nil)
    if err != nil {
        return err
    }

Collectionへの書き込み

  • collectionは、RDBでいうところのテーブルのようなもののようです
    • 以下はdbというDBのcolというcollectionに1レコード(ドキュメントという)追加する例です
    // clientは上で取得したclient
    col := client.Database("db").Collection("col")
    document := bson.D{
        {"type", "hogehoge"},
        {"fuga", "gogo"},
    }
    _, err := col.InsertOne(context.Background(), document)
  • bsonという構造体によってdocumentを表現します
    • 検索する条件等でもbsonは活躍します
    • bson.Dbson.Mがあり、書き方の違い?

FindOne(検索して一件取得する)

  • 最新の一件を取得して、それをmap[string]interface{}に加工して取得しています
    • bson.D{{"_id", -1}}この-1でSortを降順にできる模様
    col := client.Database("db").Collection("col")

    // 最新1件を取得する
    findOptions := options.FindOne().SetSort(bson.D{{"_id", -1}})
    var doc bson.M
    err := col.FindOne(
        context.Background(),
        opt,
        findOptions,
    ).Decode(&doc)

    if err == mongo.ErrNoDocuments {
        return nil, nil
    } else if err != nil {
        return nil, err
    }

    result := make(map[string]interface{})
    for key, val := range doc {
        typ := reflect.TypeOf(val)
        fmt.Printf("type:%s, key:%s, val:%v\n", typ, key, val)

        result[key] = val
    }

    return result, nil

参考にした記事