Flutter操作Firebase Firestore随机查询文档每次返回相同结果问题
问题成因
你当前的问题核心是查询未指定排序规则:
- Firestore在未显式指定
orderBy的情况下,默认会按文档ID升序返回所有匹配where条件的结果 - 你提到的米饭相关文档应该是集合里
id_created值最小的文档,只要你生成的随机数大于这个最小值,匹配结果的第一条就永远是这个文档,和随机数大小无关 - 代码中二次查询对应ID文档的逻辑是冗余操作,不会影响结果,但会浪费Firestore读取配额
现有逻辑修复方案
只需要在查询中补充按id_created倒序排序的规则,即可取到最接近你生成的随机数的文档,同时去掉冗余的二次查询优化性能:
void getRandomfromFirestore1() async { int randomNum = Random().nextInt(9998) + 1; print(randomNum.toString()); final QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("recipes") .where("id_created", isLessThanOrEqualTo: randomNum) .orderBy("id_created", descending: true) // 新增倒序排序 .limit(1) .get(); // 处理随机数小于所有文档id_created的边界情况 if (querySnapshot.docs.isEmpty) { getRandomfromFirestore1(); return; } DocumentSnapshot document = querySnapshot.docs.first; setState(() { RecipeTitle = document['title'] as String; RecipeTag = document["tag"] as String; }); print('worked'); }
其他Firestore随机查询方案
根据你的数据集大小可以选择不同的实现方案:
- 中小数据集(1万条以内):可以继续用修复后的随机数匹配法,额外注意首次查询无结果时自动重试即可
- 极小数据集(1000条以内):可以一次性拉取全集合的文档ID列表,客户端生成随机索引取对应ID查询,实现最简单无边界问题
- 中等数据集(1万-10万条):提前在独立文档中维护集合的总文档数,查询时生成随机偏移量,用
limit(1).offset(随机偏移)实现,注意偏移量过大时性能会下降 - 超大数据集(10万条以上):使用分片散列方案,给每个文档新增0-19的
shard分片字段,查询时先随机选择分片编号,再在对应分片中执行随机匹配查询,可大幅提升查询性能
内容的提问来源于stack exchange,提问作者Cubii
相关产品推荐
相关产品推荐

