見出し画像

Cloud Firestore によるデータベース機能を試す

「Cloud Firestore」によるデータベース機能を試したので、まとめました


1. Cloud Firestore

Cloud Firestore」は、Firebaseが提供するNoSQLクラウドデータベースサービスです。階層構造のデータを格納することができます。

階層構造の要素は、次のとおりです。

・コレクション : フォルダ
    ・ドキュメント : ファイル
        ・フィールド : 属性
            ・string : 文字列
            ・number : 数値
            ・boolean : ブール値
            ・map : 辞書
            ・array : リスト
            ・null : nul
            ・timestamp : 日時
            ・geopoint : 位置情報
            ・reference : エイリアス

階層構造の設計のポイントは、次のとおりです。

・ドキュメント内に公開情報・非公開情報は分ける
 
  (アクセス権限はドキュメント単位)
・ドキュメント間の1対1のリレーションにはリファレンス型を利用
・ドキュメント間の1対多のリレーションにはサブコレクションを利用

2. 使用料金

使用料金は、次のとおりです。

3. データベースの作成

はじめに、データベースを作成します。

(1) Firebaseのコンソールでプロジェクトを作成。

(2) Firebaseプロジェクトで「Firestore Database」を選択し、「データベースの作成」を押す。

(3) 「本番モード」と「テストモード」を選択。
テストモード」は、全ユーザーがアクセスが許可されているモード、「本番モード」は自分でアクセス権限のルールを編集するモードです。

(4) 「リージョン」を選択。

デフォルトの「データベース」が生成されました。データベースの各種操作が可能になります。

・データ : データの追加、削除。
・ルール : アクセス権限のルールの設定。
・インデックス : インデックスの追加、削除。
・使用状況 : 使用状況の確認。
・Extensions : 拡張機能。

(5) 「コレクションを開始」をクリックし、コレクションの情報 (コレクションID) を入力し、「次へ」をクリック。

(6) 最初のドキュメントの情報 (ドキュメントIDと各種フィールド) を入力し、保存をクリック。

コレクションと最初のドキュメントが追加されます。

フィールドで使用できるデータ型は、次のとおりです。

・string
・number
・boolean
・map
・array
・null
・timestamp
・geopoint

4. サービスアカウントキーの準備

Firebase Admin SDK」を利用するには、Firebaseプロジェクトの「サービスアカウントキー」が必要です。

(1) Firebaseプロジェクトの歯車アイコンをクリックし、「プロジェクトの設定」を選択し、「サービスアカウント」タブを選択し、「サービスアカウントを作成」ボタンを押す。

(2) 「新しい秘密鍵の生成」ボタンを押す。
「サービスアカウントキー」(*.json)がダウンロードできます。

5. PythonによるCloud Firestoreの操作

5-1. ドキュメントの取得

ドキュメントの取得手順は、次のとおりです。

(1) Pythonの仮想環境の準備。
(2) パッケージのインストール。

$ pip install firebase-admin

(3) Pythonスクリプトの作成。
serviceAccountKey.json」には、自分のサービスアカウントキーのパスを指定してください。

import firebase_admin
from firebase_admin import credentials, firestore

# Firestoreへの接続
cred = credentials.Certificate("serviceAccountKey.json")
default_app = firebase_admin.initialize_app(cred)
db = firestore.client()

# ドキュメントの取得
col_ref = db.collection("users")
doc = col_ref.document("001").get()
if doc.exists:
    print(doc.id, ":", doc.to_dict())
001 : {'age': 15, 'name': '後藤ひとり'}

5-2. ドキュメントの追加

ドキュメントの追加手順は、次のとおりです。

# ドキュメントの追加
col_ref = db.collection("users")
col_ref.document("002").set({
    "name": "喜多郁代",
    "age": 15
})

5-3. ドキュメント一覧の取得

ドキュメント一覧の取得手順は、次のとおりです。

# ドキュメント一覧の取得
docs = db.collection("users").stream()
for doc in docs:
    print(doc.id, ":", doc.to_dict())
001 : {'age': 15, 'name': '後藤ひとり'}
002 : {'age': 15, 'name': '喜多郁代'}

5-4. ドキュメントの更新

ドキュメントの更新手順は、次のとおりです。

# ドキュメントの更新
col_ref = db.collection("users")
col_ref.document("002").update({
    "age": 16
})

5-5. ドキュメントの削除

ドキュメントの削除手順は、次のとおりです。

# ドキュメントの取得
doc_ref = db.collection("users").document("002")
doc_ref.delete()

5-6. ドキュメントのクエリ

ドキュメントのクエリ手順は、次のとおりです。

# ドキュメントの追加
col_ref = db.collection("users")
col_ref.document("002").set({
    "name": "喜多郁代",
    "age": 15
})
col_ref.document("003").set({
    "name": "伊地知虹夏",
    "age": 16
})
col_ref.document("004").set({
    "name": "山田リョウ",
    "age": 16
})

# ドキュメントのクエリ
query = db.collection("users").where("age", ">=", 16)
docs = query.get()
for doc in docs:
    print(doc.id, ":", doc.to_dict())
003 : {'age': 16, 'name': '伊地知虹夏'}
004 : {'age': 16, 'name': '山田リョウ'}

クエリ演算子は、次のとおりです。

・< : より小さい
・<= : 以下
・== : 等しい
・!= : 等しくない
・> : より大きい
・>= : 以上
・array_contains : 配列に含まれる
・array_contains_any : 配列にいずれかが含まれる
・in : 含まれている
・not_in : 配列に含まれていない

クエリは、並び替えたり制限したりできます。

query = db.collection("users").where("age", ">=", 15).order_by("age", "DESCENDING").limit(3)

・order_by() : ソート (ASCENDING / DESCENDING)
・limit() : 最大数
・limit_to_last() : 末尾最大数

6. SwiftによるCloud Firestoreの操作

6-1. ドキュメントの取得

ドキュメントの取得手順は、次のとおりです。

(1) XcodeプロジェクトのFirebaseセットアップ。
FirebaseコンソールでFirebaseプロジェクトにiOSアプリを追加し、指示に従ってXcodeプロジェクトのFirebaseセットアップを行います。
(2) パッケージのインストール。
「firebase-ios-sdk」で「FirebaseAnalytics」と「FirebaseFirestoreSwift」をインストールします。

https://github.com/firebase/firebase-ios-sdk

(3) コードの作成。

import FirebaseFirestore
import FirebaseFirestoreSwift
// Firestoreへの接続
let db = Firestore.firestore()

do {
    // ドキュメントの取得
    let colRef = db.collection("users")
    let doc = try await colRef.document("001").getDocument()
    print("\(doc.documentID) : \(doc.data()!)")
} catch {
    print("Error: \(error)")
}
001 : {'age': 15, 'name': '後藤ひとり'}

6-2. ドキュメントの追加

ドキュメントの追加手順は、次のとおりです。

do {
    // ドキュメントの追加
    let colRef = db.collection("users")
    try await colRef.document("002").setData([
        "name": "喜多郁代",
        "age": 16
    ])
} catch {
    print("Error: \(error)")
}

6-3. ドキュメント一覧の取得

ドキュメント一覧の取得手順は、次のとおりです。

do {
    // ドキュメント一覧の取得
    let colRef = db.collection("users")
    let querySnapshot = try await colRef.getDocuments()
    for doc in querySnapshot.documents {
        print("\(doc.documentID) : \(doc.data())")
    }
} catch {
    print("Error: \(error)")
}
001 : {'age': 15, 'name': '後藤ひとり'}
002 : {'age': 15, 'name': '喜多郁代'}

6-4. ドキュメントの更新

ドキュメントの更新手順は、次のとおりです。

do {
    // ドキュメントの更新
    let colRef = db.collection("users")
    try await colRef.document("002").updateData([
        "age": 16
    ])
} catch {
    print("Error: \(error)")
}

6-5. ドキュメントの削除

ドキュメントの削除手順は、次のとおりです。

do {
    // ドキュメントの削除
    let colRef = db.collection("users")
    try await colRef.document("002").delete()
} catch {
    print("Error: \(error)")
}

6-6. ドキュメントのクエリ

ドキュメントのクエリ手順は、次のとおりです。

do {
    // ドキュメントの追加
    let colRef = db.collection("users")
    try await colRef.document("002").setData([
        "name": "喜多郁代",
        "age": 15
    ])
    try await colRef.document("003").setData([
        "name": "伊地知虹夏",
        "age": 16
    ])
    try await colRef.document("004").setData([
        "name": "山田リョウ",
        "age": 16
    ])
    
    // ドキュメントのクエリ
    let querySnapshot = try await colRef
        .whereField("age", isGreaterThanOrEqualTo: 16).getDocuments()
    for doc in querySnapshot.documents {
        print("\(doc.documentID) : \(doc.data())")
    }
} catch {
    print("Error: \(error)")
}
003 : {'age': 16, 'name': '伊地知虹夏'}
004 : {'age': 16, 'name': '山田リョウ'}

ソート付きクエリは、次の通りです。

let querySnapshot = try await colRef
    .whereField("age", isGreaterThanOrEqualTo: 15)
    .order(by:"age", descending: true).getDocuments()
004 : ["name": 山田リョウ, "age": 16]
003 : ["age": 16, "name": 伊地知虹夏]
002 : ["age": 15, "name": 喜多郁代]
001 : ["age": 15, "name": 後藤ひとり]

クエリ演算子は、次のとおりです。

・isLessThan : より小さい
・isLessThanOrEqualTo : 以下
・isEqualTo : 等しい
・isNotEqualTo : 等しくない
・isGreaterThan : より大きい
・isGreaterThanOrEqualTo: 以上
・arrayContains : 配列に含まれる
・arrayContainsAny : 配列にいずれかが含まれる
・in : 含まれている
・notIn : 配列に含まれていない

クエリは、並び替えたり制限したりできます。

let querySnapshot = try await colRef
    .whereField("age", isGreaterThanOrEqualTo: 15)
    .order(by:"age", descending: true)
    .limit(to: 3).getDocuments()

・order(by: descending:) : ソート
・limit(to:) : 最大数
・limit(toLast:) : 末尾最大数

関連



この記事が気に入ったらサポートをしてみませんか?