Я пытаюсь выяснить, есть ли разумный способ сделать это:
Моя проблема:
Превышение моей дневной квоты на чтение в 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 просто не предназначена для такого количества документов, которые можно получить за один раз?