Эффективность поиска с использованием whereArrayContains

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

Query query = db.collection("groups").whereArrayContains("members", userid);


АЛЬТЕРНАТИВНОЕ РЕШЕНИЕ

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

Пример:

for(String groupid : list) {
    Query query = db.collection("test-groups").document(groupid);

    FirestoreRecyclerOptions<GroupResponse> response = new FirestoreRecyclerOptions.Builder<GroupResponse>()
            .setQuery(query, GroupResponse.class)
            .build();
}

Есть ли способ добавить несколько запросов к FirestoreRecyclerOptions?

1 ответ

Решение

По мере роста количества документов в коллекции и увеличения количества элементов в массиве этот поиск станет очень неэффективным?

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

Максимальный размер документа: 1 МБ (1 048 576 байт).

Как видите, вы ограничены 1 МБ данных в одном документе. Когда мы говорим о хранении текста, вы можете хранить довольно много, но по мере увеличения массива будьте осторожны с этим ограничением.

Если вы храните большой объем данных в массивах, и многие пользователи должны обновлять эти массивы, есть еще одно ограничение, о котором вам нужно позаботиться. Таким образом, вы ограничены 1 записью в секунду на каждый документ. Таким образом, если у вас есть ситуация, в которой все пользователи одновременно пытаются записывать / обновлять данные в одни и те же документы, вы можете увидеть, что некоторые из этих записей не удаются. Так что будьте осторожны с этим ограничением тоже.

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

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

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

В заключение, поместите данные в один и тот же документ, только если вам нужно, чтобы они отображались вместе. Также не делайте их такими большими, чтобы вам приходилось загружать больше данных, которые вам действительно нужны. Поэтому размещайте данные в сборе, если вы хотите искать отдельные поля этих данных или если вы хотите, чтобы ваши данные имели место для роста. Оставьте ваши данные как поле карты, если вы хотите использовать родительский объект на основе этих данных. И если у вас есть предметы, которые вы обычно используете в качестве флагов, продолжайте с массивами.

Также не беспокойтесь о медленном запросе в Firestore.

Другие вопросы по тегам