FirestoreRecyclerOptions. Запрос требует ошибки индекса, когда индекс не нужен. Только когда я использую orderBy - PullRequest
1 голос
/ 20 февраля 2020

Я использую базу данных Firestore и FirebaseUI для загрузки результатов в представление переработчика в android kotlin. Я испытываю что-то странное.

Я понимаю ошибку "Запрос требует индекс", когда выполняется слишком много разных запросов в разных полях. Тем не менее, я понимаю, что вы можете сделать много запросов, где EqualTo вместе с одним запросом orderBy. Теперь, когда я делаю этот запрос сам (не используя FirestoreRecyclerOptions). У меня нет проблем, и это прекрасно работает.

Однако, когда я использую запрос с FirestoreRecyclerOptions, например, вот так:

 var querySearch = FirebaseFirestore.getInstance()
            .collection(DB_DEALS_COLLECTION).document(departureCountry.toString()).collection(DB_DEALS_SUB_COLLECTION)
            .whereEqualTo(FILTER_FIELD_APR, true)
            .whereEqualTo(FILTER_FIELD_AUG, true)
            .whereEqualTo(FILTER_FIELD_DEC, true)
            .orderBy(FILTER_FIELD_TIMESTAMP, Query.Direction.DESCENDING).limit(15)

        val options = FirestoreRecyclerOptions.Builder<Deal>().setQuery(querySearch, Deal::class.java).build()

Я получаю эту ошибку:

[ Firestore]: Listen for Query(target=Query(deals_collection/USA/deals where monthApr == true and monthAug == true and monthDec == true order by -timestamp, -__name__);limitType=LIMIT_TO_FIRST) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index.

Теперь, две странные вещи: 1. На самом деле правильные результаты показывают в моем обзоре переработчика, я думаю, насколько я проверял. Но я волнуюсь, почему я получаю это сообщение, и я не хочу иметь неправильные результаты в будущем. 2. Когда я нажимаю на ссылку в консоли, чтобы добавить индекс, я получаю следующее сообщение в консоли Firestore: «Я должен создать составной индекс с этими полями:

monthApr Ascending 
monthAug Ascending 
monthDec Ascending 
timestamp Descending

Теперь я никогда хотел, чтобы эти поля были восходящими, только отметка времени?

Примечание: это происходит только тогда, когда я включаю:

.orderBy(FILTER_FIELD_TIMESTAMP, 

Также в консоли, которую я вижу, limitType=LIMIT_TO_FIRST. Также я вижу, -__name__. Что это, я их никогда не устанавливал!

Надеюсь, моя проблема ясна, я немного запутался со всем этим.

Спасибо!

1 Ответ

0 голосов
/ 20 февраля 2020

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

FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<T, H>(options) {
   // ... 

    @Override
    public void onError(@NonNull FirebaseFirestoreException e) {
        Log.w(TAG, "onError", e);
    }
};

Затем в вашем logcat вы Вы увидите полную ошибку, которая будет содержать ссылку, по которой вы можете щелкнуть, чтобы автоматически создать отсутствующий индекс.

Что касается других ваших вопросов:

  • Создавали ли вы свои данные с того же устройства? ? Если это так, это объясняет, почему вы видите данные в RecyclerView несмотря на ошибку. Он приходит из автономного кэша, который не использует индексы.
  • .limit(15) - менее подробный способ сказать .limitToFirst(15). Таким образом, вы можете игнорировать limitType=LIMIT_TO_FIRST.
  • __name__ - это специальное зарезервированное поле для идентификатора документа. Каждый отдельный запрос, который вы выполняете, упорядочивается по __name__ в конце, таким образом вы всегда получаете результаты в одном и том же порядке, даже если в других пунктах orderBy есть значение ie.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...