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
, которая будет содержать информацию о различных пользователях, каждый из которых представлен документом:
пользователей
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');
Быстрый
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");
Ява
Питон
Python
С++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Идти
PHP
PHP
Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .
Единство
DocumentReference documentRef = db.Collection("users").Document("alovelace");
С#
С#
Дополнительную информацию об установке и создании клиента 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");
Ява
Питон
Python
С++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Идти
PHP
PHP
Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .
Единство
CollectionReference collectionRef = db.Collection("users");
С#
С#
Дополнительную информацию об установке и создании клиента 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");
Ява
Питон
Python
С++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Идти
PHP
PHP
Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .
Единство
DocumentReference documentRef = db.Document("users/alovelace");
С#
С#
Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .
Руби
Иерархические данные
Чтобы понять, как работают иерархические структуры данных в Cloud Firestore , рассмотрим пример чат-приложения с сообщениями и чат-комнатами.
Вы можете создать коллекцию под названием rooms
для хранения различных чат-комнат:
name : "my chat room"
...
Теперь, когда у вас есть чаты, решите, как хранить сообщения. Возможно, вам не захочется хранить их в документе чата. Документы в Cloud Firestore должны быть лёгкими, а чат может содержать большое количество сообщений. Однако вы можете создавать дополнительные коллекции в документе чата в виде подколлекций.
Подколлекции
Лучший способ хранения сообщений в этом случае — использование подколлекций. Подколлекция — это коллекция, связанная с конкретным документом.
Вы можете создать подколлекцию, называемую messages
, для каждого документа комнаты в вашей коллекции rooms
:
name : "my chat room"
from : "alex"
msg : "Hello World!"
...
...
В этом примере вы создадите ссылку на сообщение в подколлекции с помощью следующего кода:
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");
Ява
Питон
Python
С++
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");
С#
С#
Дополнительную информацию об установке и создании клиента Cloud Firestore см. в разделе Библиотеки клиента Cloud Firestore .
Руби
Обратите внимание на чередование коллекций и документов. Ваши коллекции и документы всегда должны следовать этому шаблону. Нельзя ссылаться на коллекцию в коллекции или на документ в документе.
Подколлекции позволяют иерархически структурировать данные, упрощая к ним доступ. Чтобы получить все сообщения в roomA
, можно создать ссылку на коллекцию messages
подколлекции и взаимодействовать с ней так же, как с любой другой ссылкой на коллекцию.
Документы в подколлекциях также могут содержать подколлекции, что позволяет увеличивать глубину вложенности данных. Вложенность данных может достигать 100 уровней.