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. По сути, так оно и есть. Есть некоторые различия (например, документы поддерживают дополнительные типы данных и ограничены размером документа), но в целом вы можете рассматривать документы как облегченные записи JSON.
подборки
Документы хранятся в коллекциях, которые представляют собой контейнеры для документов. Например, у вас может быть коллекция users, содержащая различных пользователей, каждый из которых представлен документом:
пользователя
alovelace
first : "Ada"
last : "Lovelace"
born : 1815aturing
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');
Swift
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.
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.
Ruby
Ссылка – это простой объект, который указывает на местоположение в базе данных. Вы можете создать ссылку независимо от того, есть ли там данные. При этом не выполняются никакие сетевые операции.
Вы также можете создавать ссылки на коллекции:
Web
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web
var usersCollectionRef = db.collection('users');
Swift
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.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.
Ruby
Для удобства вы также можете создавать ссылки, указав путь к документу или коллекции в виде строки, компоненты которой разделены косой чертой (/). Например, чтобы создать ссылку на документ alovelace:
Web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
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.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.
Ruby
Иерархические данные
Чтобы понять, как работают иерархические структуры данных в Cloud Firestore, рассмотрим пример чат-приложения с сообщениями и чат-комнатами.
Вы можете создать коллекцию rooms, чтобы хранить в ней разные чат-комнаты:
переговорных комнат
комната
name : "my chat room"roomB
...
Теперь, когда у вас есть чат-комнаты, решите, как вы будете хранить сообщения. Возможно, вы не захотите хранить их в документе чат-комнаты. Документы в Cloud Firestore должны быть небольшими, а чат-комната может содержать большое количество сообщений. Однако вы можете создать дополнительные коллекции в документе чат-комнаты в качестве подколлекций.
Вложенные подборки
В этом случае лучше всего хранить сообщения в подколлекциях. Подколлекция — это коллекция, связанная с определенным документом.
Вы можете создать подколлекцию messages для каждого документа комнаты в коллекции rooms:
переговорных комнат
комната
name : "my chat room"сообщение
message1
from : "alex"
msg : "Hello World!"message2
...
roomB
...
В этом примере вы создадите ссылку на сообщение в подколлекции с помощью следующего кода:
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');
Swift
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.
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Подробнее о том, как установить и создать клиент Cloud Firestore, рассказывается в статье Клиентские библиотеки Cloud Firestore.
Ruby
Обратите внимание на чередование коллекций и документов. Ваши коллекции и документы должны всегда следовать этому шаблону. Вы не можете ссылаться на коллекцию в коллекции или документ в документе.
Вложенные коллекции позволяют структурировать данные иерархически, упрощая доступ к ним. Чтобы получить все сообщения в roomA, вы можете создать ссылку на подколлекцию messages и взаимодействовать с ней так же, как и с любой другой ссылкой на коллекцию.
Документы во вложенных коллекциях также могут содержать вложенные коллекции, что позволяет дополнительно вкладывать данные. Максимальный уровень вложенности данных – 100.