Есть ли обходной путь для ограничения запросов IN в Firebase до 10? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть запрос для firebase, у которого есть массив идентификаторов размером> 10. У Firebase есть ограничения на количество записей, запрашиваемых за один сеанс. Есть ли способ запроса более 10 одновременно?

[Отказ от необработанного обещания: FirebaseError: Неверный запрос. Фильтры 'in' поддерживают максимум 10 элементов в массиве значений.]

https://cloud.google.com/firestore/docs/query-data/queries

enter image description here

  let query = config.db
    .collection(USER_COLLECTION_NAME)
    .where("id", "in", matchesIdArray);
  const users = await query.get();

(matchIdArray.length должно быть неограниченным)

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Есть ли способ запрашивать более 10 одновременно?

Если бы существовал способ запрашивать больше идентификаторов одновременно, это не было бы пределом. ¯ \ _ (ツ) _ / ¯

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

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

Пример этого: если у вас есть новостной сайт и вам нужно чтобы показать последние 10 заголовков статей для каждой из 5 категорий, вы можете сделать:

  1. Выполнить 50 отдельных чтений, по одному для каждого документа.
  2. Создать документ с заголовками для последние 10 статей, а затем нужно только прочитать 5 документов (по одному для каждой категории).
  3. Создать документ с последними 10 заголовками для всех 5 категорий, а затем только один документ нужно прочитать.

В этих двух последних сценариях ios вы делаете код, который записывает в базу данных, более сложным, поскольку теперь ему нужно также писать агрегированные документы. Но взамен у вас гораздо меньше данных для чтения, что снижает стоимость и повышает производительность вашего приложения. Этот тип компромисса очень распространен при использовании баз данных SQL, которые, как правило, используются в сценарии ios, в котором количество операций чтения значительно больше, чем записей.

Для получения дополнительных рекомендаций по моделированию данных я рекомендуем:

1 голос
/ 22 апреля 2020

Ваш единственный обходной путь - сделать один запрос для каждого элемента в массиве, который вы обычно используете с одним запросом «in». Или пакетируйте запросы в массиве.

  let query = config.db
    .collection(USER_COLLECTION_NAME)
    .where("id", "==", matchesIdArray[0]);
  const users = await query.get();

Вы должны будете использовать приведенный выше код в al oop над массивом matchesIdArray и объединить результаты после того, как все они будут выполнены.

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