Firebase Summit のすべての発表内容に目を通し、Firebase を活用してアプリ開発を加速し、自信を持ってアプリを実行できる方法をご確認ください。 詳細

CloudFirestoreデータモデル

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Cloud Firestore は NoSQL のドキュメント指向データベースです。 SQL データベースとは異なり、テーブルや行はありません。代わりに、コレクションに編成されたドキュメントにデータを保存します。

ドキュメントには、一連のキーと値のペアが含まれています。 Cloud Firestore は、小さなドキュメントの大規模なコレクションを保存するために最適化されています。

すべてのドキュメントはコレクションに格納する必要があります。ドキュメントにはサブコレクションとネストされたオブジェクトを含めることができ、どちらにも文字列などのプリミティブ フィールドやリストなどの複雑なオブジェクトを含めることができます。

コレクションとドキュメントは Cloud Firestore で暗黙的に作成されます。コレクション内のドキュメントにデータを割り当てるだけです。コレクションまたはドキュメントが存在しない場合は、Cloud Firestore によって作成されます。

ドキュメント

Cloud Firestore では、ストレージの単位はドキュメントです。ドキュメントは、値にマップされるフィールドを含む軽量のレコードです。各ドキュメントは名前で識別されます。

ユーザーalovelaceを表すドキュメントは次のようになります。

  • アロブレイス

    first : "Ada"
    last : "Lovelace"
    born : 1815

ドキュメント内の複雑でネストされたオブジェクトは、マップと呼ばれます。たとえば、次のように、マップを使用して上記の例からユーザーの名前を構造化できます。

  • アロブレイス

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

ドキュメントが JSON によく似ていることに気付くかもしれません。実際、彼らは基本的にそうです。いくつかの違いがあります (たとえば、ドキュメントは追加のデータ型をサポートし、サイズが 1 MB に制限されています) が、一般的に、ドキュメントは軽量の JSON レコードとして扱うことができます。

コレクション

ドキュメントは、ドキュメントの単なるコンテナーであるコレクションに存在します。たとえば、さまざまなユーザーを含むusersコレクションを作成し、それぞれをドキュメントで表すことができます。

  • ユーザー

    • アロブレイス

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore はスキーマレスであるため、各ドキュメントに入力するフィールドと、それらのフィールドに保存するデータ型を完全に自由に設定できます。同じコレクション内のドキュメントはすべて、異なるフィールドを含むか、それらのフィールドに異なるタイプのデータを格納できます。ただし、ドキュメントをより簡単にクエリできるように、複数のドキュメントで同じフィールドとデータ型を使用することをお勧めします。

コレクションにはドキュメントのみが含まれます。値を持つ生のフィールドを直接含めることはできず、他のコレクションを含めることもできません。 (Cloud Firestore でより複雑なデータを構造化する方法については、階層データを参照してください。)

コレクション内のドキュメントの名前は一意です。ユーザー ID などの独自のキーを提供することも、Cloud Firestore にランダム ID を自動的に作成させることもできます。

コレクションを「作成」または「削除」する必要はありません。コレクションに最初のドキュメントを作成すると、コレクションが存在します。コレクション内のすべてのドキュメントを削除すると、コレクションは存在しなくなります。

参考文献

Cloud Firestore のすべてのドキュメントは、データベース内の場所によって一意に識別されます。前の例では、コレクションusers内のドキュメントalovelaceを示しました。コード内でこの場所を参照するには、その場所への参照を作成できます。

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
迅速
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
ジャワ
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
パイソン
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
行け
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP

PHP

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

$document = $db->collection('samples/php/users')->document('alovelace');
団結
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

DocumentReference documentRef = db.Collection("users").Document("alovelace");
ルビー
document_ref = firestore.col("users").doc("alovelace")

参照は、データベース内の場所を指すだけの軽量オブジェクトです。そこにデータが存在するかどうかに関係なく、参照を作成できます。参照を作成しても、ネットワーク操作は実行されません。

コレクションへの参照を作成することもできます:

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
迅速
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
let usersCollectionRef = db.collection("users")
Objective-C
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

CollectionReference usersCollectionRef = db.collection("users");

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
ジャワ
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
パイソン
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
行け
usersRef := client.Collection("users")
PHP

PHP

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

$collection = $db->collection('samples/php/users');
団結
CollectionReference collectionRef = db.Collection("users");
C#

C#

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

CollectionReference collectionRef = db.Collection("users");
ルビー
collection_ref = firestore.col "users"

便宜上、ドキュメントまたはコレクションへのパスを文字列として指定し、パス コンポーネントをスラッシュ ( / ) で区切って参照を作成することもできます。たとえば、 alovelaceドキュメントへの参照を作成するには:

Web version 9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
迅速
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
ジャワ
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
パイソン
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
行け
// Reference to a document with id "alovelace" in the collection "users"
alovelaceRef := client.Doc("users/alovelace")
PHP

PHP

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

$document = $db->document('users/alovelace');
団結
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

DocumentReference documentRef = db.Document("users/alovelace");
ルビー
document_path_ref = firestore.doc "users/alovelace"

階層データ

Cloud Firestore で階層データ構造がどのように機能するかを理解するために、メッセージとチャット ルームを備えたチャット アプリの例を考えてみましょう。

ルームと呼ばれるコレクションを作成して、さまざまなチャットroomsを保存できます。

  • ルーム

    • A

      name : "my chat room"

    • B

      ...

チャット ルームができたので、メッセージの保存方法を決定します。それらをチャット ルームのドキュメントに保存したくない場合があります。 Cloud Firestore のドキュメントは軽量である必要があり、チャット ルームには多数のメッセージを含めることができます。ただし、サブコレクションとして、チャット ルームのドキュメント内に追加のコレクションを作成できます。

サブコレクション

このシナリオでメッセージを保存する最善の方法は、サブコレクションを使用することです。サブコレクションは、特定のドキュメントに関連付けられたコレクションです。

roomsコレクション内のすべてのルーム ドキュメントに対して、 messagesというサブコレクションを作成できます。

  • ルーム

    • A

      name : "my chat room"

      • メッセージ

        • メッセージ1

          from : "alex"
          msg : "Hello World!"

        • メッセージ 2

          ...

    • B

      ...

この例では、次のコードを使用して、サブコレクション内のメッセージへの参照を作成します。

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
迅速
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Objective-C
注:この製品は、watchOS および App Clip ターゲットでは使用できません。
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
ジャワ
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
パイソン
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
行け
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP

PHP

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
団結
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

Cloud Firestore クライアントのインストールと作成の詳細については、 Cloud Firestore クライアント ライブラリを参照してください。

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
ルビー
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

コレクションとドキュメントが交互に配置されていることに注意してください。コレクションとドキュメントは、常にこのパターンに従う必要があります。コレクション内のコレクションまたはドキュメント内のドキュメントを参照することはできません。

サブコレクションを使用すると、データを階層的に構造化できるため、データへのアクセスが容易になります。 roomA内のすべてのメッセージを取得するには、サブコレクションmessagesへのコレクション参照を作成し、他のコレクション参照と同じように操作できます。

サブコレクション内のドキュメントにもサブコレクションを含めることができるため、データをさらにネストできます。最大 100 レベルの深さまでデータをネストできます。