whereArrayContains ограничение до 10 - PullRequest
0 голосов
/ 09 января 2020

Я хочу отфильтровать QuestionCollection на основе tagIDs . Все работает нормально, но , где Arraycontains работает для максимум 10 идентификаторов.

Как я мог бы улучшить свою структуру , чтобы она работала более 10 tagIDs, а также сделать так, чтобы при звонке на сервер было меньше вызовов , чтобы сократить денежные расходы .

Firestore-root
   |
   --- questions (collection)
   |     |
   |     --- qid (documents)
   |          |
   |          --- title: "Question Title"
   |          |
   |          --- qid: "autogeneratedID"
   |          |
   |          --- tagIDs =[tagID_1,tagID_2...tag_IDs_5] // array
   |
   --- tags (collection)
   |     |
   |     --- tagID (documents)
   |          |
   |          --- tagName: "Mathematics"
   |          |
   |          --- tagID: "autogeneratedID"
   |

извлечение вопросов, содержащих указанные c идентификаторы тегов ( завершается неудачей, если идентификаторы тегов больше 10 )

private fun fetchQuestion(tagMap: HashMap<String, String>) {

        val tagIDList:MutableList<String> = ArrayList();
        for ((key) in tagMap) { 
            tagIDList.add(key);
        }
        var query: Query = db.collection(Constants.QUESTION_COLLECTION)
                .orderBy(Constants.KEY_QUESTION_ID, Query.Direction.DESCENDING).limit(50)
        if(!tagIDList.isNullOrEmpty())
            query = query.whereArrayContainsAny("tagIDs", tagIDList);//if list greater than 10 it's not working

        query.get().addOnSuccessListener { queryDocumentSnapshots ->
                if(!queryDocumentSnapshots.isEmpty){
                    for (documentSnapshot in queryDocumentSnapshots) {
                        val question = documentSnapshot.toObject(QuestionBO::class.java)
                    }
                }
            }.addOnFailureListener { e ->
                toast("No record found.")
                e.printStackTrace()
            }
    }

1 Ответ

2 голосов
/ 09 января 2020

Документация для запросов whereArrayContains очень конкретна c. Он может работать только с 10 элементами массива:

с помощью оператора array-contains-any можно объединить до 10 array-contains предложений в одном поле с логическим OR

Вы должны знать, что whereArrayContains не уменьшает количество считываний с выставленным счетом. Если ваш массив содержит 10 элементов, он все равно будет стоить 10 чтений документа. Если вы выполните 10 запросов whereArrayContains, каждый из которых содержит 10 элементов массива, это все равно будет стоить 100 операций чтения.

Если вам нужно N документов, ярлык для чтения этих N документов меньше, чем стоимость N документа. читает.

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