You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore调查应用数据结构优化:如何低成本查询用户未回答的随机题目

最低成本实现方案

核心思路是新增极少量冗余数据,避免全集合扫描,单次查询成本控制在10次文档读取以内,开发量极低:

  • 第一步:新增两个冗余字段
    1. 在用户文档(现有用户集合的单用户文档下)新增answered_question_ids数组字段,存储该用户已经回答过的问题ID,用户每次提交问题答案时,同步把对应问题ID追加到该数组中,和原有写入Answers子集合的操作合并为批量写入即可,额外开销可忽略
    2. 在问题集合的每个问题文档下新增固定随机值字段random_tag,问题创建时就生成一个0~1之间的随机数存入,永久不变,给该字段建好索引
  • 第二步:随机拉取未回答问题的逻辑
    1. 先本地生成一个0~1之间的随机数r
    2. 发起查询:按random_tag >= r的条件过滤问题集合,按random_tag正序排序,limit取12条(比需要的8条多预留4条,用来排除已回答的问题)
    3. 拿到查询结果后,过滤掉ID存在用户answered_question_ids字段中的问题,凑够8条即可返回使用
    4. 极端情况(随机到的12条里用户已答的超过4条,凑不够8条),再发起一次补查询:按random_tag < r的条件过滤,按random_tag倒序排序,limit取缺少的数量即可,该场景触发概率极低,几乎不会增加额外成本

可选优化(适合问题总量超过10万、用户人均答题量超过2000的场景)

如果问题量级极大,上述方案偶尔需要二次查询,可以做少量调整:

  • 给所有问题新增连续自增的序号字段seq,新增问题时自动分配最新序号
  • 拉取问题时先在1到最大序号范围内生成12个不重复的随机数,直接用in查询匹配seq等于这些随机数的问题,后续过滤逻辑和上述一致,查询效率更高,也完全避免全表扫描

内容的提问来源于stack exchange,提问作者Junjie Yang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:48:04