Модель данных Cloud Firestore

Cloud Firestore — это NoSQL-база данных, ориентированная на работу с документами. В отличие от SQL-базы данных, здесь нет таблиц и строк. Вместо этого данные хранятся в документах , организованных в коллекции .

Каждый документ содержит набор пар «ключ-значение». Cloud Firestore оптимизирован для хранения больших коллекций небольших документов.

Все документы должны храниться в коллекциях. Документы могут содержать подколлекции и вложенные объекты, которые могут включать как простые поля, например строки, так и сложные объекты, например списки.

Коллекции и документы создаются в Cloud Firestore автоматически. Просто назначьте данные документу внутри коллекции. Если коллекция или документ не существуют, Cloud Firestore создаст их.

Документы

В Cloud Firestore единицей хранения является документ. Документ — это облегчённая запись, содержащая поля, которые соответствуют значениям. Каждый документ идентифицируется по имени.

Документ, представляющий пользователя alovelace может выглядеть так:

  • alovelace

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

Сложные, вложенные объекты в документе называются картами. Например, вы можете структурировать имя пользователя из примера выше с помощью карты, вот так:

  • alovelace

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

Вы можете заметить, что документы очень похожи на JSON. По сути, так оно и есть. Есть некоторые различия (например, документы поддерживают дополнительные типы данных и ограничены размером 1 МБ), но в целом документы можно рассматривать как облегчённые JSON-записи.

Коллекции

Документы хранятся в коллекциях, которые представляют собой просто контейнеры для документов. Например, можно создать коллекцию users , которая будет содержать информацию о различных пользователях, каждый из которых представлен документом:

  • пользователей

    • alovelace

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

    • созревание

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

Cloud Firestore не имеет схем, поэтому вы можете свободно выбирать, какие поля добавлять в каждый документ и какие типы данных в них хранить. Документы в пределах одной коллекции могут содержать разные поля или хранить в них разные типы данных. Тем не менее, рекомендуется использовать одни и те же поля и типы данных в нескольких документах, чтобы упростить запросы к ним.

Коллекция содержит только документы и ничего больше. Она не может напрямую содержать необработанные поля со значениями и не может содержать другие коллекции. (См. раздел «Иерархические данные» для получения информации о том, как структурировать более сложные данные в Cloud Firestore .)

Имена документов в коллекции уникальны. Вы можете предоставить собственные ключи, например, идентификаторы пользователей, или позволить Cloud Firestore автоматически создавать случайные идентификаторы.

Вам не нужно создавать или удалять коллекции. Коллекция существует после создания первого документа в коллекции. Если удалить все документы в коллекции, она перестанет существовать.

Ссылки

Каждый документ в Cloud Firestore уникально идентифицируется по своему расположению в базе данных. В предыдущем примере документ alovelace в коллекции users . Чтобы ссылаться на это расположение в коде, вы можете создать на него ссылку .

Web

import { doc } from "firebase/firestore";

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

Web

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"];

Kotlin

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

Java

DocumentReference 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("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
С++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
Идти

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

$document = $db->collection('samples/php/users')->document('alovelace');
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Руби
document_ref = firestore.col("users").doc("alovelace")

Ссылка — это лёгкий объект, который просто указывает на определённое место в базе данных. Вы можете создать ссылку независимо от наличия данных в ней, и её создание не требует выполнения каких-либо сетевых операций.

Вы также можете создавать ссылки на коллекции :

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Быстрый
Примечание: этот продукт недоступен на устройствах watchOS и App Clip.
let usersCollectionRef = db.collection("users")
Objective-C
Примечание: этот продукт недоступен на устройствах watchOS и App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin

val usersCollectionRef = db.collection("users")

Java

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

Dart

final usersCollectionRef = db.collection("users");
Ява
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Питон
users_ref = db.collection("users")

Python

users_ref = db.collection("users")
С++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Идти

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

$collection = $db->collection('samples/php/users');
Единство
CollectionReference collectionRef = db.Collection("users");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

CollectionReference collectionRef = db.Collection("users");
Руби
collection_ref = firestore.col "users"

Для удобства вы также можете создавать ссылки, указывая путь к документу или коллекции в виде строки, разделяя компоненты пути косой чертой ( / ). Например, чтобы создать ссылку на документ alovelace :

Web

import { doc } from "firebase/firestore"; 

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

Web

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"];

Kotlin

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

Java

DocumentReference 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("users/alovelace")

Python

a_lovelace_ref = db.document("users/alovelace")
С++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
Идти

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

$document = $db->document('users/alovelace');
Единство
DocumentReference documentRef = db.Document("users/alovelace");
С#

С#

Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .

DocumentReference documentRef = db.Document("users/alovelace");
Руби
document_path_ref = firestore.doc "users/alovelace"

Иерархические данные

Чтобы понять, как работают иерархические структуры данных в Cloud Firestore , рассмотрим пример чат-приложения с сообщениями и чат-комнатами.

Вы можете создать коллекцию под названием rooms для хранения различных чат-комнат:

    • комната А

      name : "my chat room"

    • комната B

      ...

Теперь, когда у вас есть чаты, решите, как хранить сообщения. Возможно, вам не захочется хранить их в документе чата. Документы в Cloud Firestore должны быть лёгкими, а чат может содержать большое количество сообщений. Однако вы можете создавать дополнительные коллекции в документе чата в виде подколлекций.

Подколлекции

Лучший способ хранения сообщений в этом случае — использование подколлекций. Подколлекция — это коллекция, связанная с конкретным документом.

Вы можете создать подколлекцию, называемую messages , для каждого документа комнаты в вашей коллекции rooms :

    • комната А

      name : "my chat room"

      • сообщений

        • сообщение1

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

        • сообщение2

          ...

    • комната B

      ...

В этом примере вы создадите ссылку на сообщение в подколлекции с помощью следующего кода:

Web

import { doc } from "firebase/firestore"; 

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

Web

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"];

Kotlin

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

Java

DocumentReference 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("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
С++
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');
Идти

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
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");
С#

С#

Дополнительную информацию об установке и создании клиента 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 уровней.