Cloud Firestore:FAILED_PRECONDITION:查询需要索引

Mik*_*Lin 10 android firebase google-cloud-firestore

我在 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());
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

我收到错误,但我有一个索引。

获取文档时出错。com.google.firebase.firestore.FirebaseFirestoreException: FAILED_PRECONDITION: 查询需要索引。您可以在此处创建:https : //console.firebase.google.com/project/exam-package/database/firestore/indexes?create_index=EglxYmFua2xpc3QaCQoFdmFsaWQQAhoNCgl0aW1lc3RhbXAQAxoMCghfX25hbWVfXxAD 查询需要索引。你可以在这里创建它: 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) at com.google.firebase.firestore.f.zzv.zzb(SourceFile:2089) at 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) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at 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)第764章)第764章)第764章)第764章)第764章)第764章)第764章)第764章)runInContext(ClientCallImpl.java:498) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at java.util.concurrent.Executors $RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at 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)runInContext(ClientCallImpl.java:498) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at java.util.concurrent.Executors $RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at 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)run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) at 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) 在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章)run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent .FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 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章)Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at 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)Executors$RunnableAdapter.call(Executors.java:457) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at 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)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)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)

Yas*_*ash 13

我遇到了这个问题,我知道我们必须为数据库创建索引。

您可以通过简单的解决方案解决此问题。

LOG类中首先显示错误消息。

例如Log.e(TAG, task.getException().getLocalizedMessage);

在 Logcat 窗口中,您将看到带有链接的消息。

单击该链接,它将打开 firebase 控制台网站并显示一个用于创建索引的对话框弹出窗口。

只需单击添加索引按钮

然后刷新应用程序。它会起作用!

并根据您的代码

Query query = questionRef.whereEqualTo("field1", "
content1 ") .whereEqualTo("field2",content2)
.orderBy("field3")
.limit(LIMIT);

看起来您已经为“field3”添加了索引,但在控制台中确保索引正确并已启用。


Gen*_* Bo 7

为了更好地理解 Firebase 索引,找到了一篇很好的文章,用一个简单的句子介绍了基本思想,https : //www.fullstackfirebase.com/cloud-firestore/indexes

每当您想在单个查询中使用两个 where 子句时,Cloud Firestore 中都需要索引。

.. 到目前为止,我还没有在 Firebase 官方文档中遇到的解释。

====

据我所知,Firebase 文档开始讨论索引如何帮助性能,但没有解释对于第一次看到它的人来说实际上是什么索引

从谷歌搜索的第一个结果开始:firestore 理解索引 https://firebase.google.com/docs/firestore/query-data/indexing

Cloud Firestore 通过要求每个查询都有一个索引来确保查询性能。为您自动创建最基本查询所需的索引。在您使用和测试应用时,Cloud Firestore 会生成错误消息,帮助您创建应用所需的其他索引。本页介绍了如何管理单字段索引和复合索引。

在此分享,以防其他人也在搜索以了解此特定细节。


Mik*_*Lin 1

经过多次尝试得到了答案

事实证明,“现场”顺序和方向确实很重要。

就我而言:我建立了一个索引

字段1:升序

提交3:升序

它不起作用

索引必须是

字段2:升序

提交3:升序

或者

字段1:升序

字段2:升序

提交3:升序

如果你用过

字段2:升序

归档3:降序

行不通的。

或者

字段2:升序

字段1:升序

提交3:升序

行不通的。