Cloud Firestore:FAILED_PRECONDITION:查询需要索引

新手上路,请多包涵

我在 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。 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.ContextRunna ble.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) Caused by: 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) at .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(ClientCallI) mpl.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。 com.google.firebase.firestore.g.zza$zza.run(源文件: 190) 在 java.lang.Thread.run(Thread.java:764)

原文由 Jack Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 275
1 个回答

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

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

首先在 LOG 类中显示错误信息。

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

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

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

只需单击“ 添加索引”按钮

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

并根据您的代码:

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

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

原文由 Yash 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题