Firebase 如何在firestore中的数百万数据之间分页? 背景
我们的区块链有数十个碎片,每个碎片包含数百万个区块。每个块包含Firebase 如何在firestore中的数百万数据之间分页? 背景,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我们的区块链有数十个碎片,每个碎片包含数百万个区块。每个块包含shardID,高度,时间戳字段 我当前将所有块存储在名为blocks的同一集合中,因为我希望对所有碎片中的所有块进行排序。我过去常常将每个碎片的块存储在其相应的shardBlocks集合中,但我不知道如何跨集合排序 我在shardID和height字段上创建了一个复合索引 { "collectionGroup": "blocks", "queryScope": "COLLECTION", "fields": [
shardID
,高度
,时间戳
字段
我当前将所有块存储在名为blocks
的同一集合中,因为我希望对所有碎片中的所有块进行排序。我过去常常将每个碎片的块存储在其相应的shardBlocks
集合中,但我不知道如何跨集合排序
我在shardID
和height
字段上创建了一个复合索引
{
"collectionGroup": "blocks",
"queryScope": "COLLECTION",
"fields": [
{ "fieldPath": "shardID", "order": "ASCENDING" },
{ "fieldPath": "height", "order": "DESCENDING" }
]
}
问题
我正在使用下面的代码对我从firestore中学到的块进行分页
但它很容易出错带宽耗尽。之前我记得我看到过一条错误消息,说限制是最大10000
问题:
- 在这种情况下我如何分页
我尝试过,如果我知道批处理中第一个块的时间戳
,我可以使用startAt
或startAfter
获得该批处理,而且速度非常快。但是我不知道上面提到的时间戳:(
- 如果我将块拆分为每个碎片的集合,我可以使用
height
在每个碎片中独立分页。但是,如何在不同的碎片(即集合)之间进行排序
这可能是在运行一次又一次的负载,直到极限高得离谱吗?您当前使用的是极限(start),这似乎可能是触发过多读取的罪魁祸首。我将使用静态数字作为极限,然后从那里开始
如果pageSize保持不变,pageIndex不断增加,则可能会多次抓取前几个文档,或者在每页之后,您会增加呼叫的大小
例如:
第1页,pageIndex=0,pageSize=25,start=0。这不会加载任何内容
第二页,pageIndex=1,pageSize=25,start=25。这将加载25个文档
第3页,pageIndex=2,pageSize=25,start=50。这将加载50个文档,包括您已经从第2页加载的文档(意味着您现在有25个冗余文档)
let query = await this.blocksCollection.orderBy("timestamp", "desc");
let start = pageIndex * pageSize;
if (start) {
let a = Date.now();
let skip = await this.blocksCol
.orderBy("timestamp", "desc")
.limit(start)
.get();
let prev = skip.docs[skip.docs.length - 1];
query = query.startAfter(prev);
}
let snapshot = await query.limit(pageSize).get();
return snapshot.docs.map(d => d.data()) as Block[];