Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何在firestore中的数百万数据之间分页? 背景_Firebase_Google Cloud Firestore - Fatal编程技术网

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[];