Переход на чтение квоты в Firebase FireStore - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь выяснить, есть ли разумный способ сделать это:

Моя проблема:

Превышение моей дневной квоты на чтение в firestore довольно быстро.

Моя база данных и что я делаю:

Моя база данных выглядит так (упрощенно):

sessions: {                 // collection
    sessionId: {            // document
        users: {            // collection
            userId: {       // document
                id: string
                items: {    // collection
                    itemId: trackObject
                }
            }
        }
    }
}

Теперь я хочу получить из одного сеанса всех пользователей и их элементы. Большинство сессий имеют 2-3 пользователя, но некоторые пользователи имеют около 3000 элементов. Я в основном хочу получить массив, как это:

[
    {
        userId,
        items: [
            ...items
        ],
    },
    ...users
]

Как я сейчас это делаю:

Итак, я получаю всех пользователей:

const usersRef = db.collection(`sessions/${sessionId}/users`);
const userSnapshots = await usersRef.get();
const userDocs = userSnapshots.docs;

Затем для каждого пользователя я получаю свои предметы:
(Я использую цикл for, который можно обсуждать, но в любом случае)

const user = userDocs[i].data();
const itemsRef = usersRef.collection(`${user.id}/items`);
const itemSnapshots = await itemRef.get();
const items = itemSnapshots.docs

Наконец, я получаю реальные предметы по карте:

user.items = items.map(doc => doc.data());
return user;

Моя теория:

Похоже, что если я сделаю это в сеансе, где у пользователя есть 3000 элементов, код выполнит 3000 операций чтения в firestore. После 17 пробежек я съедаю 50000 операций в день.

Это рассуждение несколько основано на этом ответе .

Мой вопрос:

Есть ли другой способ сделать это? Как получить все треки в одном вызове? Должен ли я посмотреть, смогу ли я разместить все элементы в ключе массива в пользовательском объекте вместо хранения в виде коллекции? Разве бесплатная версия FireStore просто не предназначена для такого количества документов, которые можно получить за один раз?

1 Ответ

1 голос
/ 31 марта 2019

Если вы пытаетесь уменьшить количество операций чтения документов, вам нужно уменьшить количество документов, которые вам нужно прочитать, чтобы реализовать ваш вариант использования.

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

Также подумайте, должен ли каждый элемент быть отдельным документом, или вы можете объединить все элементы пользователя в один документ. Например, если вы никогда не запрашиваете отдельные элементы, нет необходимости хранить их как отдельные документы.

Еще одна вещь, которую стоит рассмотреть, можете ли вы объединить общие элементы в один документ. Примером этого является то, что даже если вы храните элементы в отдельной подколлекции, сохраняйте имена и идентификаторы последних 30 элементов для пользователя в документе пользователя. Это позволяет легко показывать пользователю и его 30 последних элементов. Делая это, вы по существу предварительно визуализируете эти 30 элементов каждого пользователя, что значительно сокращает количество документов, которые вам нужно прочитать.

Чтобы узнать больше о моделях моделирования данных, см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...