У меня есть функция, которая извлекает сообщения из моей базы данных Firestore, и я следую документации для разбиения запроса на страницы по последнему индексному документу, но по какой-то причине после первой выборки при попытке запустить следующий запрос я получаю com.google.firebase. firestore.FirebaseFirestoreException: INVALID_ARGUMENT: предложение Order by не может содержать повторяющиеся поля. uploadTimeStamp
Я также вошел в систему и увидел, что запрос выглядит нормально, а значение LastVisible на самом деле имеет индекс 4 в списке документов после выполнения первого запроса, но каким-то образом во втором запросе я снова получаю все первые 5 сообщений.
есть идеи, что я могу делать неправильно?
У меня есть функция, которая извлекает сообщения из моей базы данных Firestore, и я следую документации для разбиения запроса на страницы по последнему индексному документу, но по какой-то причине после первой выборки при попытке запустить следующий запрос я получаю com.google.firebase. firestore.FirebaseFirestoreException: INVALID_ARGUMENT: предложение Order by не может содержать повторяющиеся поля. uploadTimeStamp Я также вошел в систему и увидел, что запрос выглядит нормально, а значение LastVisible на самом деле имеет индекс 4 в списке документов после выполнения первого запроса, но каким-то образом во втором запросе я снова получаю все первые 5 сообщений. есть идеи, что я могу делать неправильно? [code] suspend fun getMyPosts(userID: String): Flow = flow { Log.d(TAG, "getMyPosts() called -> userID is $userID") var data: QuerySnapshot? = null try { data = dbRef.collection("posts") .whereEqualTo("userID", userID) .orderBy("uploadTimeStamp", Query.Direction.DESCENDING) .limit(5) .get() .await() Log.d(TAG, "emitting ${data.documents.size} posts: \n") data.documents.forEach { doc -> Log.d( TAG, "post number ${data.documents.indexOf(doc)}, timestamp: ${doc.get("uploadTimeStamp")}" ) }
emit(data.documents) while (!data!!.isEmpty && data.size() == 5) { Log.d(TAG, "getting more posts") val lastVisible = data.documents[data.size() - 1] Log.d(TAG, "last index is ${data.size() - 1}") Log.d(TAG, "lastVisible is ${lastVisible.get("uploadTimeStamp")}") data = data.query .whereEqualTo("userID", userID) .orderBy("uploadTimeStamp", Query.Direction.DESCENDING) .startAfter(lastVisible) .limit(5) .get() .await() if (!data.isEmpty) { Log.d(TAG, "emitting ${data.documents}") emit(data.documents) } } } catch (e: Exception) { Log.d(TAG, "Failed to get MyPosts,\n $e") data!!.documents.forEach { doc -> Log.d( TAG, "post number ${data.documents.indexOf(doc)}, timestamp: ${doc.get("uploadTimeStamp")}" ) } } }
[/code] вот лог-код, когда я запускаю getMyPosts(), чтобы вы могли видеть, что я каким-то образом снова получаю первые 5 документов: [code] 2021-06-03 12:31:33.349 4990-5249/avedot.app D/AppRepository: getMyPosts() called -> userID is ncTe77npPHPJyQvJJdRUAY1fEBB3 2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: emitting 5 posts: 2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: post number 0, timestamp: 1622708658810 2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: post number 1, timestamp: 1622708316148 2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 2, timestamp: 1622665878322 2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 3, timestamp: 1622665769466 2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 4, timestamp: 1622661053130 2021-06-03 12:31:34.082 4990-5249/avedot.app D/AppRepository: getImages() called 2021-06-03 12:31:34.083 4990-5249/avedot.app D/AppRepository: [false, false, true] 2021-06-03 12:31:35.345 4990-5249/avedot.app D/AppRepository: [false, true, true] 2021-06-03 12:31:36.068 4990-5249/avedot.app D/AppRepository: [true, true, true] 2021-06-03 12:31:37.084 4990-5249/avedot.app D/AppRepository: [false, false, true] 2021-06-03 12:31:37.294 4990-5249/avedot.app D/AppRepository: [false, false, true] 2021-06-03 12:31:37.500 4990-5249/avedot.app D/AppRepository: getting more posts 2021-06-03 12:31:37.500 4990-5249/avedot.app D/AppRepository: last index is 4 2021-06-03 12:31:37.501 4990-5249/avedot.app D/AppRepository: lastVisible is 1622661053130 2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: Failed to get MyPosts, com.google.firebase.firestore.FirebaseFirestoreException: INVALID_ARGUMENT: Order by clause cannot contain duplicate fields uploadTimeStamp 2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: post number 0, timestamp: 1622708658810 2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: post number 1, timestamp: 1622708316148 2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 2, timestamp: 1622665878322 2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 3, timestamp: 1622665769466 2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 4, timestamp: 1622661053130 [/code] это моя структура документа Firestore [img]https://i.sstatic.net/jfLMv.png [/img]