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 : 1815first : "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');
Быстрый
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
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
Python
Python
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Идти
PHP
PHP
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Руби
Ссылка — это легковесный объект, который просто указывает на местоположение в вашей базе данных. Вы можете создать ссылку независимо от того, существуют ли там данные, и создание ссылки не выполняет никаких сетевых операций.
Вы также можете создавать ссылки на коллекции :
Web
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web
var usersCollectionRef = db.collection('users');
Быстрый
let usersCollectionRef = db.collection("users")
Objective-C
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
Python
Python
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Идти
PHP
PHP
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Единство
CollectionReference collectionRef = db.Collection("users");
C#
C#
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Руби
Для удобства вы также можете создавать ссылки, указывая путь к документу или коллекции в виде строки, где компоненты пути разделены косой чертой ( / ). Например, чтобы создать ссылку на документ alovelace :
Web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web
var alovelaceDocumentRef = db.doc('users/alovelace');
Быстрый
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
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
Python
Python
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Идти
PHP
PHP
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Единство
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Руби
Иерархические данные
Чтобы понять, как работают иерархические структуры данных в 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');
Быстрый
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
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
Python
Python
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Идти
PHP
PHP
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Единство
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Для получения дополнительной информации об установке и создании клиента Cloud Firestore см. раздел «Библиотеки клиентов Cloud Firestore .
Руби
Обратите внимание на чередование коллекций и документов. Ваши коллекции и документы всегда должны следовать этому шаблону. Вы не можете ссылаться на коллекцию внутри коллекции или на документ внутри документа.
Вложенные коллекции позволяют структурировать данные иерархически, упрощая доступ к ним. Чтобы получить все сообщения в roomA , можно создать ссылку на коллекцию messages вложенной коллекции и взаимодействовать с ней так же, как и с любой другой ссылкой на коллекцию.
Документы в подколлекциях могут содержать и подколлекции, что позволяет создавать еще более вложенные структуры данных. Вложенность данных может достигать 100 уровней.