Android WhererrayContains限制为10

Android WhererrayContains限制为10,android,firebase,kotlin,google-cloud-firestore,Android,Firebase,Kotlin,Google Cloud Firestore,我想根据标记ID筛选问题集合。一切正常,但其中的ArrayContains最多可使用10个id 我如何改进我的结构,以便为10个以上的tagid工作,并确保尽可能少地呼叫服务器,以减少资金支出 Firestore-root | --- questions (collection) | | | --- qid (documents) | | | --- title: "Question Title" |

我想根据标记ID筛选问题集合。一切正常,但其中的ArrayContains最多可使用10个id

我如何改进我的结构,以便为10个以上的
tagid
工作,并确保尽可能少地呼叫服务器,以减少资金支出

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"
   |
获取包含特定标记ID的问题(如果标记ID大于10则失败)

私人问题(tagMap:HashMap){
val tagIDList:MutableList=ArrayList();
对于标记映射中的((键){
tagIDList.add(键);
}
var query:query=db.collection(Constants.QUESTION\u collection)
.orderBy(常量.键\问题\ ID,查询.方向.降序).限制(50)
如果(!tagIDList.isNullOrEmpty())
query=query.whererraycontainsany(“tagIDs”,tagIDList);//如果列表大于10,则它不起作用
query.get().addOnSuccessListener{queryDocumentSnapshots->
如果(!queryDocumentSnapshots.isEmpty){
用于(queryDocumentSnapshots中的documentSnapshot){
val question=documentSnapshot.toObject(QuestionBO::class.java)
}
}
}.addOnFailureListener{e->
toast(“未找到任何记录”)
e、 printStackTrace()
}
}
查询非常具体。它只能用于10个数组项:

使用
array contains any
运算符将同一字段上最多10个
array contains
子句与逻辑

您应该知道,whererraycontains不会减少计费文档的读取次数。如果数组包含10项,则仍需要读取10个文档。如果执行10个whererraycontains查询,每个查询包含10个数组项,则仍需要100次读取


如果您需要N个文档,那么没有捷径可以使这些N个文档读取的成本低于N个文档读取的成本。

Doug Stevenson,因此您可以建议一个更好的结构来获取10个以上的标记ID。不,我不能。您必须多次查询。@DougStevenson如果我有100个图像URL作为ArrayList,并且如果我想得到()这100个URL,它只算作一个文档读取,对吗?@DougStevenson假设我现在在一个文档中有一个包含5个项目的数组,如果我使用
查询该文档,那么它是否算作5个读取计数?也许你应该重新考虑你的数据结构。也许你不应该有一个tagID数组,你应该有一个单独的集合,对于给定的ID,它返回一个tagID文档,然后从那里继续。你找到解决问题的方法了吗?我有同样的问题。
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()
            }
    }