Эффективность поиска с использованием whereArrayContains
Мне любопытно, насколько эффективен поиск документов в коллекции с использованием этого кода. По мере роста количества документов в коллекции и количества элементов в массиве этот поиск станет очень неэффективным? Есть ли лучший способ сделать это или есть изменение схемы, которое я могу внести в базу данных, чтобы лучше оптимизировать это? Есть ли где-нибудь, где я могу найти временную сложность этих функций, возможно, для документации firestore?
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.