データモデル
Firestore は NoSQL ドキュメント指向データベースです。SQL データベースとは違い、テーブルや行はありません。代わりに、データは「ドキュメント」に格納し、それが「コレクション」にまとめられます。
各「ドキュメント」には、一連の Key-Value ペアが含まれています。Firestore は、小さなドキュメントからなる大きなコレクションを格納するために最適化されています。
すべてのドキュメントはコレクションに保存する必要があります。ドキュメントには、「サブコレクション」と、ネストされたオブジェクトを格納できます。このどちらにも、文字列などの基本フィールドや、リストなどの複雑なオブジェクトを含めることができます。
コレクションとドキュメントは Firestore で暗黙的に作成されます。ユーザーはデータをコレクション内のドキュメントに割り当てるだけです。コレクションまたはドキュメントのいずれかが存在しない場合は、Firestore によって作成されます。
ドキュメント
Firestore では、ストレージの単位はドキュメントになります。ドキュメントは、値にマッピングされるフィールドを含む軽量のレコードです。各ドキュメントは名前で識別されます。
ユーザー alovelace
を表すドキュメントは次のようになります。
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
ドキュメント内のネストされた複雑なオブジェクトはマップと呼ばれます。たとえば、上記の例のユーザー名をマップで構造化すると、次のようになります。
alovelace
name :
first : "Ada"
last : "Lovelace"
born : 1815
見てわかるように、ドキュメントは JSON によく似ており、実際基本的には JSON と同じです。いくつかの違いはありますが(たとえばドキュメントでは追加のデータ型がサポートされており、サイズは 1 MB までに制限されています)、一般的にドキュメントは軽量の JSON レコードとして扱うことができます。
コレクション
ドキュメントはコレクションの中にあります。コレクションは端的に言えばドキュメントのコンテナです。たとえば、users
コレクションを作成して、さまざまなユーザーを表すドキュメントを格納できます。
users
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
aturing
first : "Alan"
last : "Turing"
born : 1912
Firestore はスキーマレスなので、各ドキュメントにどのフィールドを含めるか、また、そのフィールドにどのデータ型を格納するかは、完全に自由に決めることができます。同じコレクション内のドキュメントすべてに異なるフィールドを含めたり、それらのフィールドに異なるデータ型を格納したりもできます。ただし、複数のドキュメントで同じフィールドとデータ型を使用するほうが、ドキュメントのクエリが容易になります。
コレクションにはドキュメントだけが含まれます。コレクションに値を持つ生のフィールドを直接含めることはできず、他のコレクションを含めることもできません。Firestore でより複雑なデータを構造化する方法については、階層データをご覧ください。
コレクション内のドキュメントの名前は一意です。ユーザー ID などの独自のキーを指定することも、Firestore で自動的にランダムな ID を作成することもできます。
コレクションを「作成」したり「削除」したりする必要はありません。コレクション内の最初のドキュメントを作成すると、コレクションが暗黙的に作成され、コレクション内のドキュメントをすべて削除すると、コレクションも削除されます。
参照
Firestore のすべてのドキュメントは、データベース内の場所によって一意に識別されます。前の例では、コレクション users
中のドキュメント alovelace
を示しました。コード内でこの場所を参照するには、その場所への「リファレンス」を作成します。
Web バージョン 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Web バージョン 8
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Kotlin+KTX
Android
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Dart
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Java
Python
Python
(非同期)
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Go
PHP
PHP
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
リファレンスは、単にデータベース内の場所を示す軽量なオブジェクトです。リファレンスはそこにデータがあるかどうかにかかわらず作成でき、リファレンスを作成してもネットワーク操作は実行されません。
コレクションへのリファレンスも作成できます。
Web バージョン 9
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web バージョン 8
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Kotlin+KTX
Android
val usersCollectionRef = db.collection("users")
Java
Android
CollectionReference usersCollectionRef = db.collection("users");
Dart
final usersCollectionRef = db.collection("users");
Java
Python
Python
(非同期)
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Go
PHP
PHP
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
便宜上、ドキュメントまたはコレクションへのパスを文字列として指定し、パス コンポーネントをスラッシュ(/
)で区切ってリファレンスを作成することもできます。たとえば、alovelace
ドキュメントへのリファレンスは次のように作成します。
Web バージョン 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web バージョン 8
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Kotlin+KTX
Android
val alovelaceDocumentRef = db.document("users/alovelace")
Java
Android
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Dart
final aLovelaceDocRef = db.doc("users/alovelace");
Java
Python
Python
(非同期)
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Go
PHP
PHP
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
階層データ
Firestore で階層データ構造がどのように機能するかを理解するために、メッセージとチャットルームを使ったチャットアプリの例を見てみましょう。
さまざまなチャットルームを格納するための rooms
と呼ばれるコレクションを作成できます。
rooms
roomA
name : "my chat room"
roomB
...
これでチャットルームができたので、メッセージを保存する方法を指定します。チャットルームのドキュメントに保存することはおすすめしません。Firestore 内のドキュメントは軽量にする必要がありますが、チャットルームには膨大な数のメッセージが格納される可能性があるからです。ただし、チャットルームのドキュメント内にサブコレクションとして追加のコレクションを作成できます。
サブコレクション
このシナリオでメッセージを保存するための最善の方法は、サブコレクションを使用することです。サブコレクションは特定のドキュメントに関連付けられたコレクションです。
rooms
コレクション内のすべてのルーム ドキュメントに、messages
というサブコレクションを作成できます。
rooms
roomA
name : "my chat room"
messages
message1
from : "alex"
msg : "Hello World!"
message2
...
roomB
...
この例では、次のコードを使用して、サブコレクション内のメッセージへのリファレンスを作成します。
Web バージョン 9
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Web バージョン 8
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
Swift
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Objective-C
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
Kotlin+KTX
Android
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Java
Android
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
Dart
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Java
Python
Python
(非同期)
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Go
PHP
PHP
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Firestore に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Ruby
コレクションとドキュメントが交互になるよう注意してください。コレクションとドキュメントは常にこのパターンで従う必要があります。コレクション内のコレクションや、ドキュメント内のドキュメントは参照できません。
サブコレクションを使用すると、データを階層的に構造化できるため、データへのアクセスが容易になります。roomA
にあるすべてのメッセージを取得するために、サブコレクション messages
へのコレクション リファレンスを作成して、それを他のコレクション リファレンスと同じように操作できます。
サブコレクション内のドキュメントにもサブコレクションを格納できるため、データをさらにネストできます。データは最大 100 レベルまでネストできます。