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

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 МБ), но в целом вы можете рассматривать документы как облегченные записи JSON.

Коллекции

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

  • users

    • аловелайс

      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");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection("users").document("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');
Идти

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");
C#

C#

Для получения дополнительной информации об установке и создании клиента 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");
Java
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection("users")

Python

users_ref = db.collection("users")
C++
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");
C#

C#

Для получения дополнительной информации об установке и создании клиента 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");
Java
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document("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');
Идти

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");
C#

C#

Для получения дополнительной информации об установке и создании клиента 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 должны быть легковесными, а чат может содержать большое количество сообщений. Однако вы можете создавать дополнительные коллекции внутри документа чата в качестве подколлекций.

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

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

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

  • комнаты

    • комнатаА

      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");
Java
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
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")
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');
Идти

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");
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 уровней.