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

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

Коллекции

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

  • пользователей

    • alovelace

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • turing

      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");
Ява
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Питон
a_lovelace_ref = db.collection("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
С++
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");
С#

С#

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

Python

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

С#

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

Python

a_lovelace_ref = db.document("users/alovelace")
С++
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");
С#

С#

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

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

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

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

  • комнат

    • комнатаА

      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");
Ява
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Питон
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")
С++
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");
С#

С#

Дополнительную информацию об установке и создании клиента 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 уровней в глубину.