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 уровней в глубину.