Облачное хранилище: FAILED_PRECONDITION: для запроса требуется индекс - PullRequest
0 голосов
/ 07 мая 2018

Я сделал запрос в Cloud Firestore,

CollectionReference questionRef = db.collection("collectionName");
        Query query = questionRef.whereEqualTo("field1", "content1")
                .whereEqualTo("field2",content2)
                .orderBy("field3")
                .limit(LIMIT);
        query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
        {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task)
            {
                if (task.isSuccessful())
                {
                    for (DocumentSnapshot document : task.getResult())
                    {
                        Log.d(TAG, document.getId() + " => " + document.getData());
                    }
                }
                else
                {
                    Log.w(TAG, "Error getting documents.", task.getException());
                }
            }
        });

и я получил ошибки, но у меня был индекс.

Ошибка при получении документов. com.google.firebase.firestore.FirebaseFirestoreException: FAILED_PRECONDITION: для запроса требуется индекс. Вы можете создать это Вот: https://console.firebase.google.com/project/exam-package/database/firestore/indexes?create_index=EglxYmFua2xpc3QaCQoFdmFsaWQQAhoNCgl0aW1lc3RhbXAQAxoMCghfX25hbWVfXxAD на com.google.firebase.firestore.g.zzs.zza (SourceFile: 100) на com.google.firebase.firestore.b.zzd.zza (SourceFile: 122) на com.google.firebase.firestore.b.zzab.zza (SourceFile: 333) на com.google.firebase.firestore.b.zzf.zza (SourceFile: 236) на com.google.firebase.firestore.f.zzo.zza (SourceFile: 6529) на com.google.firebase.firestore.f.zzv.zzb (SourceFile: 2089) на com.google.firebase.firestore.f.zza $ zzb.zza (SourceFile: 73) на com.google.firebase.firestore.g.zzm $ 1.onMessage (SourceFile: 77) на io.grpc.ForwardingClientCallListener.onMessage (ForwardingClientCallListener.java:36) на io.grpc.ForwardingClientCallListener.onMessage (ForwardingClientCallListener.java:36) в io.grpc.internal.ClientCallImpl $ ClientStreamListenerImpl $ 1MessagesAvailable.runInContext (ClientCallImpl.java:498) на io.grpc.internal.ContextRunnable.run (ContextRunnable.java:37) на io.grpc.internal.SerializingExecutor.run (SerializingExecutor.java:123) в java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:457) в java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:301) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:636) на com.google.firebase.firestore.g.zza $ zza.run (SourceFile: 190) на java.lang.Thread.run (Thread.java:764) Причина: io.grpc.StatusException: FAILED_PRECONDITION: для запроса требуется индекс. Вы можете создать его здесь: https://console.firebase.google.com/project/exam-package/database/firestore/indexes?create_index=EglxYmFua2xpc3QaCQoFdmFsaWQQAhoNCgl0aW1lc3RhbXAQAxoMCghfX25hbWVfXxAD на io.grpc.Status.asException (Status.java:534) на com.google.firebase.firestore.g.zzs.zza (SourceFile: 98) на com.google.firebase.firestore.b.zzd.zza (SourceFile: 122) на com.google.firebase.firestore.b.zzab.zza (SourceFile: 333) на com.google.firebase.firestore.b.zzf.zza (SourceFile: 236) на com.google.firebase.firestore.f.zzo.zza (SourceFile: 6529) на com.google.firebase.firestore.f.zzv.zzb (SourceFile: 2089) на com.google.firebase.firestore.f.zza $ zzb.zza (SourceFile: 73) на com.google.firebase.firestore.g.zzm $ 1.onMessage (SourceFile: 77) на io.grpc.ForwardingClientCallListener.onMessage (ForwardingClientCallListener.java:36) на io.grpc.ForwardingClientCallListener.onMessage (ForwardingClientCallListener.java:36) в io.grpc.internal.ClientCallImpl $ ClientStreamListenerImpl $ 1MessagesAvailable.runInContext (ClientCallImpl.java:498) на io.grpc.internal.ContextRunnable.run (ContextRunnable.java:37) на io.grpc.internal.SerializingExecutor.run (SerializingExecutor.java:123) в java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:457) в java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:301) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:636) на com.google.firebase.firestore.g.zza $ zza.run (SourceFile: 190) at java.lang.Thread.run (Thread.java:764)

Ответы [ 4 ]

0 голосов
/ 03 июля 2019

Пытаясь лучше понять индексы Firebase, нашел хорошую статью, в которой основная идея представлена ​​в одном простом предложении: https://www.fullstackfirebase.com/cloud-firestore/indexes:

Индексы требуются в Cloud Firestore всякий раз, когда вы хотите использовать два предложения where в одном запросе.

.. объяснение, которое я до сих пор не встречал в официальных документах Firebase.

====

Насколько я могу судить, документы Firebase начинают обсуждать, как индексы помогают повысить производительность, без объяснения того, что index на самом деле для того, кто его видит впервые.

С первого результата поиска в Google: Индексы понимания Firestore https://firebase.google.com/docs/firestore/query-data/indexing

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

Здесь, в случае, если другие тоже ищут, чтобы понять эту конкретную деталь.

0 голосов
/ 28 июля 2018

Я не думаю, что порядок полей имеет значение, как это упоминается в вышеприведенном посте.

Например, если вы берете:

Поле 1: Asc Поле 2: Desc

тогда должно работать. Если вы используете метод orderby в Field2, тогда явно определите Query.direction как Desc. Потому что это Asc по умолчанию.

1010 * Reference *

0 голосов
/ 25 марта 2019

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

Это можно исправить с помощью простого решения.

Первое сообщение об ошибке отображения в LOG Class.

например. Log.e (TAG, task.getException (). GetLocalizedMessage);

В окне Logcat вы увидите сообщение с ссылка .

Нажмите на эту ссылку , откроется веб-сайт консоли Firebase и отобразится одно всплывающее окно диалога для создания индекса.

Просто нажмите на кнопку добавления индекса .

Затем обновите приложение. Это будет работать!

А согласно вашему коду

Query query = questionRef.whereEqualTo ("field1", "content1")
.whereEqualTo ( "поле2", Content2)
.orderBy ( "field3")
.limit (ПРЕДЕЛ);

Похоже, вы добавили индекс для "field3", но в консоли убедитесь, что индекс правильный и включен.

0 голосов
/ 07 мая 2018

Я получил ответ через несколько попыток,

Оказывается, «полевой» порядок и направление действительно имеют значение.

в моем случае: я построил индекс

field1: восходящая

filed3: восходящая

не работает

Индекс должен быть

field2: восходящая

filed3: восходящая

или

field1: восходящая

field2: восходящая

filed3: восходящая

Если вы использовали

field2: восходящая

filed3: по убыванию

не будет работать.

или

field2: восходящая

field1: восходящая

filed3: восходящая

не будет работать.

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