如何对仅含单个文档的Firebase collectionGroup执行orderBy排序
问题原因
Firestore 的所有查询、排序操作都是针对文档层级生效的,你当前写法的逻辑是对 Calculations 集合组下的所有文档,按文档顶层的 symbol 字段排序,但你的 symbol 字段存储在文档内部的数组元素中,不属于文档顶层字段,因此 Firestore 无法识别该字段,触发索引不匹配报错,也不可能通过这种写法实现对文档内部数组元素的排序。
解决方案
根据你的使用场景选择对应方案:
- 方案1:客户端排序(适配你当前只有1个文档、数组数据量不大的场景)
先查询获取文档,再在客户端对数组内的元素自行排序,示例代码如下:const calcSnapshot = await db .firestore() .collectionGroup("Calculations") .limit(1) .get() const calcDoc = calcSnapshot.docs[0] // 此处替换为你文档中存储数组的对应字段名 const rawCalcArray = calcDoc.data().yourArrayField // 按symbol字段升序排序数组 const sortedCalcArray = rawCalcArray.sort((a, b) => a.symbol.localeCompare(b.symbol)) - 方案2:改造数据结构实现服务端排序(适合数组元素量大、客户端排序性能不足的场景)
把当前存储在单文档数组内的每个元素,拆分为Calculations集合下的独立文档,每个文档自带顶层的symbol字段,此时你原来的查询写法即可生效,触发索引报错时按照控制台提示创建对应集合组索引,等待索引构建完成后查询即可正常返回排序后的结果。
内容的提问来源于stack exchange,提问作者Muhammad Hassaan Ather
相关产品推荐
相关产品推荐

