LoginSignup
9

More than 3 years have passed since last update.

はじめに

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にはこのように登録される

f2.png

キーは一意のものが自動生成される。

ユーザー登録の場合は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)
    }
}

これでこんな感じでデータが登録される。

f1.png

データ作成もできるしすでに存在しているキーを指定すればデータの編集ができる。

名前だけ変えたいばあいは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)
    }
}

f5.png

MergeAllを書かないとこのようになる

f4.png

とりあえずデータ登録に関してはこんな感じ

データの構造としてはドキュメント(Users的な)があってその中にデータを登録していくわけだけどドキュメントの中にさらにドキュメントを作成することも可能

こんな感じ

f6.png

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()も使える

おわり:sunny:

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
9