Slide 1

Slide 1 text

Go+Firestore

Slide 2

Slide 2 text

アジェンダ ● Firebaseとは ● Firestoreとは ● データ構造 ● Goでインサートする時は ● Goで取得する時は ● まとめ

Slide 3

Slide 3 text

Firebaseって何? ● GoogleのモバイルとWebアプリ向けの開発プラットフォーム ● 特にモバイルアプリ向けのツールが揃っている ○ クラッシュレポートやテストラボなど ● モバイルアプリ以外にもストレージ、静的ホスティング、DBなどもあ る ● 個人で無料で使える枠がある

Slide 4

Slide 4 text

Cloud Firestore ● Firebaseで提供されているNoSQL型のデータベース ● Android、iOS、Web、サーバーサイドから操作可能 ● サーバーサイドはJava、Python、Node.js、Go、PHPのSDKが用意 されている ● REST APIやRPCが用意されているため他の言語でも使用可能

Slide 5

Slide 5 text

Cloud Firestoreの特徴 ● NoSQL型で特定のデータ型に特化したDB ● FirestoreのイメージとしてはJSON形式のデータを保存して、それを クエリで条件指定して取り出せるデータベース ● 1つのJSONがドキュメントと呼ばれる ● ドキュメントの集まりはコレクションと呼ばれる ● ドキュメントには更にコレクションをもたせられる ○ これをサブコレクションという

Slide 6

Slide 6 text

データ構造例 { [ “2018-05-05 12:00:00”, “2018-05-07 12:00:00” ], “Description” : “This is a test” …. } 一つのドキュメントに なる

Slide 7

Slide 7 text

データ構造例 コレクション ドキュメントのID ドキュメント詳細

Slide 8

Slide 8 text

ドキュメント詳細 配列 オブジェクト メンバー

Slide 9

Slide 9 text

サブコレクション例 サブコレクション ドキュメントID ドキュメント詳細

Slide 10

Slide 10 text

GoでFirestoreに接続 bgContext := context.Background() // Use a service account sa := option.WithCredentialsFile("./credentials/firestore_credential.json") app, err = firebase.NewApp(bgContext, nil, sa) if err != nil { log.Fatalln(err) } ダウンロードしてきた クレデンシャルを読み込ませて 新規アプリを作るだけ

Slide 11

Slide 11 text

Goでデータをインサート type Event struct { Name string   ... } event := &Event{ … } wr, err = client.Collection("event").Set(bgContext, event) structを作って structにデータを詰めて 任意のコレクションに セットするだけ IDの指定が無い場合は 自動採番される AddはIDが既に存在す る場合失敗する Setは上書きする

Slide 12

Slide 12 text

GoでID指定してデータをインサート type Event struct { Name string   ... } event := &Event{ … } wr, err = client.Collection("event").Doc(“123”).Set(bgContext, event) IDを指定する場合はDoc() を挟む

Slide 13

Slide 13 text

Goでサブコレクションにインサート type Event struct { Name string   ... } event := &Event{ … } wr, err = client.Collection("May").Doc(“123”).Collection("event") .Set(bgContext, event) Docを指定してから更に Collectionを指定する

Slide 14

Slide 14 text

Goでデータを取得する type Event struct { Name string   ... } doc, err := client.Collection("event").Doc(“123”).Get(bgContext) var event Event doc.DataTo(&event) 取得したいデータのIDを 指定する structに展開する 構造が違うと失敗するので 注意

Slide 15

Slide 15 text

Goで複数データを取得する type Event struct { Name string   ... } iter := client.Collection("event").Documents(bgContext) for { doc, err := iter.Next() if err == iterator.Done { break } var event Event doc.DataTo(&event) } まとめて取得する場合は Documentsを使用する iteratorが取得出来るので forで回してデータを 取得する

Slide 16

Slide 16 text

Goで並べ替えたデータを取得する type Event struct { Name string   ... } iter := client.Collection("event").OrderBy("TimeStamp", firestore.Asc) .Documents(bgContext) for { doc, err := iter.Next() if err == iterator.Done { break } ... } OrderByで並べ替え可能

Slide 17

Slide 17 text

Goで並べ替えたデータを取得する type Event struct { Name string   ... } iter := client.Collection("event").Where("num", ">", 10).Documents(bgContext) for { doc, err := iter.Next() if err == iterator.Done { break } ... } Where句で絞り込み可能

Slide 18

Slide 18 text

まとめ ● Web(JS)やモバイルアプリから直接DB操作が可能 ● GoにSDKが提供されているので簡単に使える ● JSONを出し入れする感覚でDBが扱える ● スキーマはないのでデータの構造の管理はプログラムで行う ● 安定性やデータが増えた時の性能等はいずれまた… ● 無料枠があるので、個人開発の選択肢としてありかも

Slide 19

Slide 19 text

ご清聴ありがとうございました!