MongoDBからデータを抽出するgolangを書く

以下の記事でMongoDBをコンテナとして実行したので、golangでそのデータを抽出します。

mongodbコンテナの起動時に初期データを登録してみる

  • MongoDBドライバーをダウンロードする
  • ソースコードを書く
  • 実行する

MongoDBドライバーをダウンロードする


まずは以下のコマンドでMongoDBのドライバーをダウンロードします。これはGoがサポートするドライバーで、ドキュメントはこちらになります。

以下のコマンドでダウンロードします。

$ go get -u "go.mongodb.org/mongo-driver/mongo"

ソースコードを書く


main.goを以下に記述しました。
/publicに対してhttpリクエストを受け付けると、MongoDBコンテナにアクセスして、recommendデータベースのcategoriesコレクションのデータを取得し、表示するプログラムです。
MongoDBコンテナの起動及び初期データ登録は、こちらの記事をご参照ください。

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
    "context"
    "github.com/gorilla/mux"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
)

func main() {
    r := mux.NewRouter()
    // localhost:8082/publicでpublicハンドラーを実行
    r.Handle("/public", public)

    //サーバー起動
    if err := http.ListenAndServe(":8082", r); err != nil {
        log.Fatal("ListenAndServe:", nil)
    }
}

var public = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    //MongoDBの認証情報
    credential := options.Credential{
      Username: "root",
      Password: "password",
    }

    //MongoDBへの接続
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    connect, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017").SetAuth(credential))
    defer connect.Disconnect(ctx)

    //collectionの取得
    collection, err := connect.Database("recommend").Collection("categories").Find(context.Background(), bson.M{})
    if err != nil { log.Fatal(err) }
    var results []bson.M
    if err = collection.All(context.TODO(), &results); err != nil {
      log.Fatal(err)
    }

    //取得したcollectionの表示
    for _, output := range results {
      fmt.Println( output["name"] )
    }
})

実行する


1. 以下のコマンドでgoを実行します。

$ go run .

2. 以下のコマンドでgoの/publicにhttpリクエストを送ります。

$ curl localhost:8082/public

そうすると、以下の出力が表示されます。
コレクションは_idとnameのmapが配列となっていて、その中でnameを抜き出しています。

スポーツ
娯楽
食事
お酒
文化
ドライブ
文化
イベント

以上です!今日は少し雑ですいません。。