已开启
perf(cloud): getDailyWords 分页拉取,避免 limit 截断 (#4) #4
perf(cloud): getDailyWords 分页拉取,避免 limit 截断 (#4) #4
已开启
雅皮士创建于 9 天前
雅皮士
雅皮士
9 天前

变更说明

针对 Issue #4 的「getDailyWords 查询效率/正确性」问题。

原实现用硬编码 limit(500) / limit(200) 拉取后在内存用 includes() 过滤:

const { documents: learnedDocs } = await databases.listDocuments(
  DB_ID, COL.records, [Query.equal('userId', userId), Query.limit(500)]);
// ...
const { documents: allWords } = await databases.listDocuments(
  DB_ID, COL.words, [Query.limit(200)]);
wordsDocs = allWords.filter(w => !learnedWordIds.includes(w.$id)).slice(0, 10);

当用户已学记录超过 500 条、或词库超过 200 词时,结果会被静默截断,出现漏词/总数不准。

变更内容

  • 新增分页辅助 listAllDocuments(每页 100,Query.offset 游标,1 万条安全上限);
  • 用 Set 替代 includes(),差集从 O(n*m) 降为 O(n);
  • totalWords 由分页得到的全量词数得出,避免额外一次 count 查询;
  • 返回结构保持不变。

验证

说明

  • 从「正确性优先」出发选择分页拉全量 + 内存差集:Appwrite 不支持 NOT IN 类查询,这是在不改数据模型前提下的稳妥改进。
  • 与 PR #3 同改 getDailyWords,但改动区域不同(本 PR 改取词段,PR #3 改日期/配置段),可自动合并。
  • 更大规模下的数据库层优化(如 learnedBy 字段 + Query.notContains)需评估 Appwrite v11 API 支持度,暂不纳入。

Refs #4

likedislike
合并受阻
雅皮士雅皮士
9 天前 关联了issue:[Bug][P1] 登录态不持久化 + UTC 时区导致连续打卡数据错乱,[Enhancement][P2] 可维护性与性能优化:dailyGoal 硬编码、查询效率、MVVM 分层、测试缺失