Firebase堆栈“错误:实体的索引条目过多”

时间:2019-12-27 08:16:37

标签: node.js database indexing google-cloud-firestore grpc

几天前,从我们的一种云功能开始,关于Error: too many index entries for entity的错误开始涌入Google Stackdriver。

我们的代码已经有一段时间没有更改了,所以我认为该错误是由于Firestore中的某些更改而导致此功能中的查询或写入操作失败。

完整的堆栈跟踪如下。

请注意,引用的文件都不是我们编写的代码,只是Google内部的函数。

Error: too many index entries for entity
    at Http2CallStream.call.on (/srv/functions/node_modules/@grpc/grpc-js/build/src/client.js:96:45)
    at Http2CallStream.emit (events.js:194:15)
    at Http2CallStream.EventEmitter.emit (domain.js:459:23)
    at process.nextTick (/srv/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at process._tickCallback (internal/process/next_tick.js:61:11)

简短的研究使我们相信索引中包含过多的文档。该功能正在访问的集合目前大约有35,000个文档。我们删除了我们创建的一个综合索引,但是错误继续发生。该错误将导致函数崩溃,并且触发该函数的HTTP请求将返回错误页面。这并不是始终可重复的,并且似乎是随机发生的(大约5%的请求失败)。

如果有必要,我很乐意提供有关Firestore设置或函数源代码的更多信息。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据this文档,单字段索引“在包含特定字段的集合中存储所有文档的排序映射”。如果您的数据库有35000个文档,它将达到您可能在同一文档中找到的限制。这可能是每个文档或某些映射或数组中的索引条目。

我想您必须设置一些“单字段索引豁免”来避免此问题。所有需要的链接都在文档中。