说现象
前两天有客服消息说我的小程序无法进行正常功能的使用了,后来定位到问题了,在 update 的时候出现错误信息:data exceed max size。
并且这个错误还开发工具上不出现,只有在手机上才出现。原因是 update 的字段内容太大了导致无法正常修改,那么我们要做的就是让参数变小。
分析问题
这个小程序是实现的是投票功能,有多层嵌套,之前的更新方案是直接修改 optionData 里面的所有内容。
数据结构解释:
optionData 是一个数组里面存储选项数据
optionData 下面还有一个joiner数据组,这个是存放用户投票信息的。
optionData内容过大导致报错,解决方案是通过只更新局部来解决。
上代码
没改之前的代码
let vote = await db.collection('activity').doc(event.id).update({
data:{
optionData:event.optionData
}
})
优化后的代码
let vote = await db.collection('activity').doc(event.id).update({
data:{
['optionData.'+ joiner.index +'.joiner']:_.push(event.userInfo)
}
})
总结
很多bug当数据量小的时候问题并不会暴露出来,数据一旦大起来问题就来了。本质上反应出一个问题就是从数据结构的设计上这个就是不合理的,不应该所有数据都存放在一个大字段里面,应该做数据拆分,然后通过联查来展示,这样更加便于后续的数据分析与统计。
最后,感谢 @老张 的指点。
后记
还有一种情况也会出现 data exceed max size ,查询数据过大。
有两种解决方案:
- 查询通过过滤一些无关字段。
1.1 聚合查询使用「project」进行过滤
1.2 普通查询使用「field」进行过滤 - 分页查询。
详细查看「云开发:实现分页功能」
以上两种方式本质上都是减少一次性的查询数据量。