【问题标题】:How to get random documents from Cloud Firestore in Dart (for Flutter)? [closed]如何从 Dart 中的 Cloud Firestore 获取随机文档(对于 Flutter)? [关闭]
【发布时间】:2023-03-28 03:15:01
【问题描述】:

假设我在 Firestore 集合中有以下文档:
如何在无需全部下载的情况下随机获取一份或多份文件?

顺便说一句,我已经看过Dan McGrath's Answer,但他没有具体解释如何为 Flutter 生成自动 ID,另外,我很想在 Dart 中看到一个完整的示例,因为他的解释非常笼统。
提前致谢!

【问题讨论】:

  • firestore sdk 中没有您可以使用的 autoId 生成器。但是您可以在此处查看(并复制)实现:github.com/flutter/plugins/blob/master/packages/cloud_firestore/…
  • 这些看起来像实时数据库推送 ID,而不是 Firestore 自动 ID。您使用的是哪个数据库?
  • @ZeRj 这回答了部分问题,但是查询代码是什么样的?
  • 您找到解决此问题的方法了吗?阅读丹的回答后,我遇到了同样的问题。
  • @Bobthebuilder24 不幸的是我还没有找到解决这个问题的方法......

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

根据 Dan 的回答,这是我目前的实现。

static const AUTO_ID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
static const AUTO_ID_LENGTH = 20;
  String _getAutoId() {
    final buffer = StringBuffer();
    final random = Random.secure();

    final maxRandom = AUTO_ID_ALPHABET.length;

    for (int i = 0; i < AUTO_ID_LENGTH; i++) {
      buffer.write(AUTO_ID_ALPHABET[random.nextInt(maxRandom)]);
    }
    return buffer.toString();
  }

查询代码:

final autoId = _getAutoId();

final query = ref
    .where("qId", isGreaterThanOrEqualTo: autoId)
    .orderBy("qId")
    .limit(count);
QuerySnapshot response = await query.getDocuments();
if (response.documents == null || response.documents.length == 0) {
  final anotherQuery = ref
      .where('qId', isLessThan: autoId)
      .orderBy('qId')
      .limit(count);
  response = await anotherQuery.getDocuments();
}

一些解释:

  1. qId 是我文档的一个字段。与 documentId 相同。
  2. 根据 Dan 的说法,此实现基于双向 回答。我们仍然有不公平的结果,但我可以接受。如果有人有更好的算法,请分享。
  3. _getAutoId()是基于firebase库的Java代码重写的。

如果您有任何问题,请提出。我会尽力提供帮助。

祝你有美好的一天!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 2022-01-06
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2021-05-27
    • 2020-05-11
    • 2021-07-02
    相关资源
    最近更新 更多