Google cloud firestore firestore子集合中的单调id

Google cloud firestore firestore子集合中的单调id,google-cloud-firestore,data-modeling,Google Cloud Firestore,Data Modeling,我正在创建一个数据库集合,其中将包含一个子集合,该子集合将包含根级别内容的旧版本。集合结构看起来与以下结构非常相似: Firestore根目录 | ---内容(收集) | ---contentId(谷歌生成)(文档) |//此处为最新字段 ----| ---历史(次收集) | ---oldContentId //此处为旧字段/值 ---oldContentId2 //此处为旧字段/值 因此,如果我想获得旧版本的内容,我可以调用: const oldContent=wait fs.collec

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

Firestore根目录
|
---内容(收集)
|
---contentId(谷歌生成)(文档)
|//此处为最新字段
----|
---历史(次收集)
|
---oldContentId
//此处为旧字段/值
---oldContentId2
//此处为旧字段/值
因此,如果我想获得旧版本的内容,我可以调用:


const oldContent=wait fs.collection(“content”).doc(contentId).collection(“history”).doc(oldContentId).get();
我想对
历史记录
子集合中的文档ID使用类似单调的ID。我知道如何避免使用此类ID来避免热点。我不清楚的是,对于子集合中文档的ID,此建议是否保持不变。我猜是的,但我只是想弄清楚

例如,假设我对子集合使用google生成的ID,并获取:


#ggdId==谷歌生成的Id
内容/ggdId-1/历史/ggdId-1
内容/ggdId-1/历史/ggdId-2
...
内容/ggdId-1/历史/ggdId-N
内容/ggdId-2/历史/ggdId-1
内容/ggdId-2/历史/ggdId-2
...
内容/ggdId-2/历史/ggdId-N
google cloud是否会比我在子集合中使用类似单调的ID更好地拆分这些数据:

content/ggdId-1/history/1
内容/ggdId-1/历史/2
...
内容/ggdId-1/历史/N
内容/ggdId-2/历史/1
内容/ggdId-2/历史/2
...
内容/ggdId-2/历史/N
最后,建议是一条硬性规定,还是根据集合/子集合的使用方式有细微差别?因此,假设我不期望对
history
子集合进行大量的高读/写操作,这是否意味着可以使用单调的id

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

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

如果您确定吞吐量不会太高而导致问题,那么就做您想做的事情。但最好使用随机生成的ID,并仅根据文档的字段进行排序


在一般意义上,由于云服务必须大规模扩展,云Firestore写入中的热点几乎总是Firestore必须更新其索引的结果,这是Firestore为了满足其读取/查询性能保证所需要的

如果对文档使用非随机ID,则会增加Firestore在更新索引时命中热点的可能性。这取决于它必须更新的索引,而不是集合是全局集合还是子集合


虽然使用子集合可能会减少对索引的写入次数,使之仅限于对该子集合的写入,但如果使用集合组查询(因为这些查询对所有同名集合都有一个索引),则可能会遇到这种情况。

要添加有关文档ID为何不应单调的更多信息,如下所示:简单地说,文档路径的连续范围由单个逻辑服务器处理。通过使文档路径随机,您的写入将命中多个逻辑服务器,从而提高可用吞吐量并减少争用。”这也适用于子集合(因为它们只是嵌套在另一个集合中的集合)