Что такое Cloud Firestore ?

Cloud Firestore — это гибкая, масштабируемая облачная база данных от Firebase и Google Cloud Platform для веба, мобильных платформ, и серверных приложений. Как и Firebase Realtime Database, она синхронизирует ваши данные между клиентскими приложениями с помощью слушателей реального времени а также предлагает поддержку оффлайн режима для мобильных платформ и веба. В данный момент Firestore находится в бета релизе.

Основные особенности:

Гибкость

Модель данных Cloud Firestore поддерживает гибкие, иерархические структуры данных. Сохраняет данные в документах, которые в свою очередь хранятся в коллекциях. Документы могут вложение объекты и подколлекции.

Выразительные запросы

В Cloud Firestore, вы можете использовать запросы для получения одного документа, определенного документа, или всех документов в коллекции, которые отвечают параметрам вашего запросы. Запросы могут могут содержать цепочки из нескольких фильтров или фильтры комбинированные с сортировкой. Также все коллекции индексируются по умолчанию, по этому производительность запроса прямо пропорциональна результату, а не размеру коллекции.

Realtime обновления

Как и Realtime Database, Cloud Firestore использует синхронизацию данных для обновления данных на каждом подключенном устройстве.

Поддержка оффлайн режима

Cloud Firestore кэширует данные, которые ваше приложения часто использует,по этому приложение может писать,читать, слушать обновления и делать запросы даже когда девайс находится в оффлайне. Когда девайс вернется в онлайн Firestore все локальные изменения в облако.

Разработанный для масштабирования

Firestore предоставляет использует мощную инфраструктуру Google Cloud Platform: автоматическую мультирегиональную репликацию данных, надежные гарантии целостности, атомарные batch операции, поддержку транзакций.

Как работает Firestore ?

Cloud Firestore — это хранимая в облаке, NoSQL база данных, с которой iOS, Android и веб приложения работают напрямую с помощью нативных SDK. Кроме того доступны SDK для Node.js, Java, Python, Go SDK, а также REST апи.

Как начать работу с Firestore

Создайте Cloud Firestore проект
1. Откройте Firebase консоль https://console.firebase.google.com/ и создайте новый проект.

2. В секции Database кликните на кнопку Get Started для Cloud Firestore
3. Выберите начальный режим для правил безопасности
Тестовый режим — хорош для начала работы с помощью мобильных и веб клиентов, но позволяет всем читать и перезаписывать ваши данные
Защищенный режим — запрещает чтения и запись с мобильных и веб клиентов.
4. Кликните на кнопку Enable

Настройте окружения разработки

Для подключения Firestore выполните следующие инструкции:
Выполните все инструкции по подключению Firebase в веб-приложение 
Добавите библиотеки Firebase и Cloud Firestore в приложение

Библиотеки также можно скачать с репозитория npm

npm install firebase@5.5.5 --save

Нужно вручную подключить две библиотеки с помощью require

const firebase = require("firebase");
require("firebase/firestore");

Инициализация Cloud Firestore

Следующая команда инициализирует экземпляр Cloud Firestore

firebase.initializeApp({
  apiKey: "FIREBASE API KEY",
  authDomain: "FIREBASE AUTH DOMAIN",
  projectId: "CLOUD FIRESTORE PROJECT ID"
});
const db = firebase.firestore();
db.settings({
  timestampsInSnapshots: true
});

Добавление данных

Как уже было сказано выше Firestore хранит данные в документах, которые в свою очередь хранятся в коллекциях. Firestore создает коллекцию при добавлении первого документа. По этому вам не нужно перед начало работы создавать коллекции или документы.
Пример создания новой коллекции и добавления нового документа

db.collection("devices").add({
platform:"android",
osVersion: "8.0",
pushToken:"Qwqsdsadsa34dsdsd2dsdsdwqadbvcxbcvb"
})
.then(function(docRef) {
console.log("Document createad with ID: ", docRef.id);
})
.catch(function(error) {
console.error("Error adding document: ", error);
});

Чтения данных

Для получения всей коллекции используйте метод get

db.collection("users").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        console.log(`${doc.id} => ${doc.data()}`);
    });
});

Для получения одного документ по идентификатору используйте следующий синтаксис:

const docRef = db.collection("users").doc("someUid");
docRef.get().then(function(doc) {
    if (doc.exists) {
        console.log("Document data:", doc.data());
    } else {
        console.log("Document doesn't exist");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});

Правила безопасности

Так как все клиенты работаю с базой данных на прямую, необходимо добавить правила безопасности которые будут контролировать права чтения и записи документов и коллекций. Правила можно разделе Правила в Firebase console

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}