はじめに
GoとFirestoreを少し触ったのでそこで得た知識をわすれないよに書きます
とりあえずデータ登録に関して....
secret.json
データを登録、取得する際にはjson形式のシークレットキー的なのを用意しなければいけません。
設定 -> サービスとアカウントからキーの取得ができます。
Add
データ登録でデータのキーを自動生成する場合に使う
package main
import (
"context"
"fmt"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
opt := option.WithCredentialsFile("secret.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
fmt.Println(err)
}
client, err := app.Firestore(ctx)
if err != nil {
fmt.Println(err)
}
_, _, err = client.Collection("Users").Add(ctx, map[string]interface{}{
"name": "First User",
"age": 11,
"email": "first@example.com"
})
if err != nil {
fmt.Println(err)
}
}
これでfirestoreにはこのように登録される
キーは一意のものが自動生成される。
ユーザー登録の場合はfirestoreのauthenticationのuidと同じにするとよいかも
Doc(id).Set()
キーを指定してデータを登録する
package main
import (
"context"
"fmt"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
opt := option.WithCredentialsFile("secret.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
fmt.Println(err)
}
client, err := app.Firestore(ctx)
if err != nil {
fmt.Println(err)
}
_, err = client.Collection("Users").Doc("1").Set(ctx, map[string]interface{}{
"name": "Update",
"age": 11,
"email": "first@example.com",
})
if err != nil {
fmt.Println(err)
}
}
これでこんな感じでデータが登録される。
データ作成もできるしすでに存在しているキーを指定すればデータの編集ができる。
名前だけ変えたいばあいはfirestore.MergeAllを使わなきゃデータがすべて上書きされてしまう。
正しい例↓
package main
import (
"context"
"fmt"
"cloud.google.com/go/firestore"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
opt := option.WithCredentialsFile("secret.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
fmt.Println(err)
}
client, err := app.Firestore(ctx)
if err != nil {
fmt.Println(err)
}
_, err = client.Collection("Users").Doc("1").Set(ctx, map[string]interface{}{
"name": "Update",
}, firestore.MergeAll)
if err != nil {
fmt.Println(err)
}
}
MergeAllを書かないとこのようになる
とりあえずデータ登録に関してはこんな感じ
データの構造としてはドキュメント(Users的な)があってその中にデータを登録していくわけだけどドキュメントの中にさらにドキュメントを作成することも可能
こんな感じ
usersドキュメントのなかにuserのデータがありuserのデータの中にfollower_idというドキュメントがありそのなかにfollower_idのデータが格納される感じ
こんな感じでいくつも階層的にデータを登録していける
登録のしかたは
Collection().Doc().Collection().Add()
みたいにして登録できる
コード↓
package main
import (
"context"
"fmt"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
opt := option.WithCredentialsFile("secret.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
fmt.Println(err)
}
client, err := app.Firestore(ctx)
if err != nil {
fmt.Println(err)
}
_, _, err = client.Collection("Users").Doc("1").Collection("follower_id").Add(ctx, map[string]interface{}{
"follower_id": "3",
})
if err != nil {
fmt.Println(err)
}
}
もちろんAdd()ではなくDoc().Set()も使える
おわり