Эффективность поиска с использованием whereArrayContains - PullRequest
0 голосов
/ 23 сентября 2018

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

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 Ответ

0 голосов
/ 24 сентября 2018

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

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

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

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

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

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

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

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

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

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

...