【问题标题】:Firestore -- io.grpc.StatusException: FAILED_PRECONDITION: The query requires an indexFirestore -- io.grpc.StatusException: FAILED_PRECONDITION: 查询需要索引
【发布时间】:2020-02-02 19:15:10
【问题描述】:

我正在使用具有以下结构的后端 Firestore 数据库构建聊天应用程序。

我正在获取如下所述的数据。它返回我的用户 ID 在字段“userArray”中涉及的频道列表,并根据给定的日期/时间获取“lastUpdatedOn”数据。

registration = fireStoreDb.collection(clsUtility.RootCollections.Channels.toString())
            .whereArrayContains("userArray", loggedInPsno)
            .whereGreaterThanOrEqualTo("lastUpdatedOn", lastChannelUpdateDateTime)
            .orderBy("lastUpdatedOn", Query.Direction.ASCENDING)
            .addSnapshotListener((queryDocumentSnapshots, e) -> {

                if (e != null) {
                    Log.w("loadUsers", "Listen failed.", e);
                    return;
                }

在上面的例子中,它在 android logcat 中显示了一个创建复合索引的错误。复合索引的创建完成,但仍然收到相同的错误消息。

2019-10-04 17:46:30.562 26824-27054/net.jayamsoft.chat W/Firestore: (21.1.1) [Firestore]: 侦听查询(userArray array_contains 90348324 和 lastUpdatedOn >= Timestamp( seconds=1570189540, nanoseconds=484000000) order by lastUpdatedOn, name) failed: Status{code=FAILED_PRECONDITION, description=查询需要索引。你可以在这里创建它:https://console.firebase.google.com/project/easychat-lthe/database/firestore/indexes?create_composite=Ck5wcm9qZWN0cy9lYXN5Y2hhdC1sdGhlL2RhdGFiYXNlcy8oZGVmYXVsdCkvY29sbGVjdGlvbkdyb3Vwcy9DaGFubmVscy9pbmRleGVzL18QARoNCgl1c2VyQXJyYXkYARoRCg1sYXN0VXBkYXRlZE9uEAEaDAoIX19uYW1lX18QAQ,cause=null} 2019-10-04 17:46:30.567 26824-26824/net.jayamsoft.chat W/loadUsers:收听失败。 com.google.firebase.firestore.FirebaseFirestoreException:FAILED_PRECONDITION:查询需要索引。你可以在这里创建它:https://console.firebase.google.com/project/easychat-lthe/database/firestore/indexes?create_composite=Ck5wcm9qZWN0cy9lYXN5Y2hhdC1sdGhlL2RhdGFiYXNlcy8oZGVmYXVsdCkvY29sbGVjdGlvbkdyb3Vwcy9DaGFubmVscy9pbmRleGVzL18QARoNCgl1c2VyQXJyYXkYARoRCg1sYXN0VXBkYXRlZE9uEAEaDAoIX19uYW1lX18QAQ 在 com.google.firebase.firestore.util.Util.exceptionFromStatus(com.google.firebase:firebase-firestore@@21.1.1:121) 在 com.google.firebase.firestore.core.EventManager.onError(com.google.firebase:firebase-firestore@@21.1.1:131) 在 com.google.firebase.firestore.core.SyncEngine.handleRejectedListen(com.google.firebase:firebase-firestore@@21.1.1:378) 在 com.google.firebase.firestore.core.FirestoreClient.handleRejectedListen(com.google.firebase:firebase-firestore@@21.1.1:307) 在 com.google.firebase.firestore.remote.RemoteStore.processTargetError(com.google.firebase:firebase-firestore@@21.1.1:551) 在 com.google.firebase.firestore.remote.RemoteStore.handleWatchChange(com.google.firebase:firebase-firestore@@21.1.1:436) 在 com.google.firebase.firestore.remote.RemoteStore.access$100(com.google.firebase:firebase-firestore@@21.1.1:53) 在 com.google.firebase.firestore.remote.RemoteStore$1.onWatchChange(com.google.firebase:firebase-firestore@@21.1.1:176) 在 com.google.firebase.firestore.remote.WatchStream.onNext(com.google.firebase:firebase-firestore@@21.1.1:108) 在 com.google.firebase.firestore.remote.WatchStream.onNext(com.google.firebase:firebase-firestore@@21.1.1:38) 在 com.google.firebase.firestore.remote.AbstractStream$StreamObserver.lambda$onNext$1(com.google.firebase:firebase-firestore@@21.1.1:119) 在 com.google.firebase.firestore.remote.AbstractStream$StreamObserver$$Lambda$2.run(com.google.firebase:firebase-firestore@@21.1.1) 在 com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(com.google.firebase:firebase-firestore@@21.1.1:67) 在 com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onNext(com.google.firebase:firebase-firestore@@21.1.1:110) 在 com.google.firebase.firestore.remote.FirestoreChannel$1.onMessage(com.google.firebase:firebase-firestore@@21.1.1:120) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) 在 io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) 在 io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:563) 在 io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) 在 io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) 在 java.util.concurrent.FutureTask.run(FutureTask.java:237) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@21.1.1:224)

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    按照链接生成错误为您提供的索引应该是您的问题的解决方案。似乎错误要求您创建 2 个索引。

    尝试跟踪错误中的确切链接并允许它创建索引。

    应该可以的。

    让我们知道。

    【讨论】:

    • 抱歉,回复晚了,是的,您是对的,它需要从 Firestore 本身建议的链接创建两个索引。但问题是,只要您点击提及网址。它会将您重定向到带有 console.firebase.google.com/u/0/project/easychat-lthe/database/… 链接的 Firebase 控制台...如果您可以仔细观察链接,它包含 0 --> 就像我尝试手动创建索引一样,它向我展示了一些基于我的项目的其他数字。就我而言,它是 25,这就是问题所在。我用 25 替换 0 并运行 url :)
    【解决方案2】:

    Firebase 的 JSON 中的键不能重复 "上次更新时间"

    【讨论】:

    • Hai Vipul,是的,键“lastUpdatedOn”在子集合中重复。正如建议的那样,我已经改变了它,但仍然得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多