如何从Dart的Cloud Firestore中获取随机文档(适用于Flutter)?

时间:2019-07-24 09:55:00

标签: firebase flutter dart google-cloud-firestore

让我们说我在Firestore集合中有以下文档: enter image description here
我如何可以随机获取一个或多个文档而不必全部下载?

顺便说一句,我已经看过Dan McGrath's Answer,但是他没有具体说明如何为Flutter生成自动ID,而且,我很想在Dart中看到一个完整的示例,因为他的解释非常通用。

预先感谢!

1 个答案:

答案 0 :(得分:0)

根据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代码重写的。

如有任何疑问,请询问。我会尽力提供帮助。

祝你有美好的一天!