几天前,从我们的一种云功能开始,关于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设置或函数源代码的更多信息。任何帮助将不胜感激。
答案 0 :(得分:1)
根据this文档,单字段索引“在包含特定字段的集合中存储所有文档的排序映射”。如果您的数据库有35000个文档,它将达到您可能在同一文档中找到的限制。这可能是每个文档或某些映射或数组中的索引条目。
我想您必须设置一些“单字段索引豁免”来避免此问题。所有需要的链接都在文档中。