Firestore 索引字段顺序重要吗?

t3c*_*b0t 6 indexing android kotlin firebase google-cloud-firestore

对于我的收藏之一,我创建了以下索引:

  • createdOn:时间戳(升序)
  • ordinal:数字(升序)
  • parent:参考(升序)

但是,当我运行使用所有三个字段的查询时,firestore 不会获取任何内容,而是建议使用此索引(最后两个字段被交换):

  • createdOn:时间戳(升序)
  • parent:参考(升序)
  • ordinal:数字(升序)

where*我还尝试更改查询中和 的顺序orderBy,但没有任何效果。所以,现在我有两个索引,但不明白为什么其中一个不起作用,而另一个则正常。

为什么我需要不同的索引?文档没有提到(至少在这里)。


我正在使用的查询是这样的:


    private val firestore = FirebaseFirestore.getInstance()

    fun texts(languageId: String, storyId: String): Task<QuerySnapshot> {
        return firestore
            .collection("/languages/$languageId/texts")
            .whereIn("createdOn", dates) // <-- List<Timestamp>
            .whereEqualTo("parent", firestore.document("/languages/$languageId/stories/$storyId"))
            .orderBy("ordinal", Query.Direction.ASCENDING)
            .get()
    }
Run Code Online (Sandbox Code Playgroud)

VHa*_*ded 3

正如@MikeG 在评论中提到的,我可以确认,字段的顺序where并不重要,但orderBy字段必须始终是最后一个。最好将索引分为 2 个索引:

  • createOn(升序)、ordinal(升序)

  • 父级(升序)、序数(升序)

Firestore在查询时会将它们合并在一起,这样可以节省一些成本,并且可以在不同场景下重用索引。