首页 > 解决方案 > firestore 子集合中的单调 ID

问题描述

我正在创建一个数据库集合,该集合将包含一个包含旧版本的根级别内容的子集合。集合结构看起来与这个问题的结构非常相似:

Firestore-root
|
--- content (collection)
    |
    --- contentId (google generated) (document)
        |   // latest fields here
        ----|
            --- history (subcollection)
                |
                --- oldContentId
                    // old field/values here
                --- oldContentId2
                    // old field/values here
       

因此,如果我想获取旧版本的内容,我可以调用:


const oldContent = await fs.collection("content").doc(contentId).collection("history").doc(oldContentId).get();

我想对history子集合中的文档 id 使用类似单调的 id。我知道避免使用此类 ID 以避免热点的建议。我不清楚的是,对于子集合中的文档的 ID,此建议是否保持不变。我的猜测是确实如此,但只是想清楚一点。

因此,例如说我为子集合使用谷歌生成的 id 并获得:


# ggdId == google generated Id
content/ggdId-1/history/ggdId-1
content/ggdId-1/history/ggdId-2
...
content/ggdId-1/history/ggdId-N

content/ggdId-2/history/ggdId-1
content/ggdId-2/history/ggdId-2
...
content/ggdId-2/history/ggdId-N

谷歌云会比我在子集合中使用类似单调的 id 更好地分割这些数据:

content/ggdId-1/history/1
content/ggdId-1/history/2
...
content/ggdId-1/history/N

content/ggdId-2/history/1
content/ggdId-2/history/2
...
content/ggdId-2/history/N

最后,建议是硬性规则,还是取决于集合/子集合的使用方式是否存在细微差别?所以说我不期望对history子集合有这么多的高读/写,这是否意味着人们可以使用类似单调的 id。

标签: google-cloud-firestoredata-modeling

解决方案


我不清楚的是,对于子集合中的文档的 ID,此建议是否保持不变。

避免单调 ID 的建议适用于所有集合,无论它们是如何嵌套的。它只是无法按照 Firestore 的要求进行扩展。确实没有解决方法。

如果您确定吞吐量不会太高以至于会导致问题,那么请执行您想要的操作。但最好使用随机生成的 ID,并仅根据文档的字段进行排序。

一般来说,对于必须大规模扩展的云服务,订购是困难的


推荐阅读