Flutter Firestore 检索随机 Firestore 文档

Mar*_* Dz 6 firebase flutter google-cloud-firestore

我希望有人可以帮助我完成以下实现:我只想从 firestore 检索随机文档。

按照这个使用自动 ID 版本的流行指南,我使用自动生成的文档 ID 并将它们保存为 field idFirestore:如何获取集合中的随机文档

[..]自动 ID 版本 如果您使用我们的客户端库中提供的随机生成的自动 ID,您可以使用同一系统随机选择文档。在这种情况下,随机排序的索引是文档 id。[...]

为查询获取随机 id 似乎是显而易见的,但对于我来说,作为菜鸟,我不确定从哪里随机获取自动 id 值以及如何在_randomIndex不运行查询的情况下适合我的值。我该如何定义我的_randomIndex现在?

QuerySnapshot querySnapshot = await ref
        .where('id', isGreaterThanOrEqualTo: _randomIndex)
        .orderBy('id', descending: true)
        .limit(1)
        .get();
Run Code Online (Sandbox Code Playgroud)

解决方案

谢谢大家!我认为对于更多的人来说,如何通过查看上述指南并使用flutter来实现给定的方法可能并不是那么简单。

例如,我在 flutter 上下文中听到有关 uuid 和随机 id 的信息,总是向我推荐流行的库,例如https://pub.dev/packages/uuid/examplehttps://pub.dev/packages/flutter_guid/install

就我而言,它们不起作用,感谢@Jigar Patel,我们现在可以完美地随机化它。在下面的例子中我们还可以确定文档的数量:

import 'dart:math';

String getRandomGeneratedId() {
  const int AUTO_ID_LENGTH = 20;
  const String AUTO_ID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  
  const int maxRandom = AUTO_ID_ALPHABET.length;
  final Random randomGen = Random();
  
  String id = '';
  for (int i = 0; i < AUTO_ID_LENGTH; i++) {
    id = id + AUTO_ID_ALPHABET[randomGen.nextInt(maxRandom)];
  }
  
Future<List<Model>> getData() async {
    List<Model> dataList = [];
    CollectionReference myRef = _db.collection('data');
    final data = ['data','data']; // demo purposes only

    
    // Retrieves 2 random data in a loop
    for (int i = 0; i < 2; i++) {

      // generate a random index based on the list length
      // and use it to retrieve the element
      
      String _randomIndex = getRandomGeneratedId();
      
      QuerySnapshot querySnapshot = await myRef
        .where('data', arrayContainsAny: data)
        .where('id', isGreaterThanOrEqualTo: _randomIndex)
        .orderBy('id', descending: false)
        .limit(1)
        .get();
        
        dataList.addAll(_dataListFromSnapshot(querySnapshot));
    }
    return dataList;
  }
Run Code Online (Sandbox Code Playgroud)

Jig*_*tel 4

对于 Auto-Id 版本,您需要创建一个随机 id(for _randomIndex),就像firebase 为新文档创建 id 一样,如下所示

import 'dart:math';

String getRandomGeneratedId() {
  const int AUTO_ID_LENGTH = 20;
  const String AUTO_ID_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  
  const int maxRandom = AUTO_ID_ALPHABET.length;
  final Random randomGen = Random();
  
  final StringBuffer buffer = StringBuffer();
  for (int i = 0; i < AUTO_ID_LENGTH; i++) {
    buffer.write(AUTO_ID_ALPHABET[randomGen.nextInt(maxRandom)]);
  }
  
  return buffer.toString();
}
Run Code Online (Sandbox Code Playgroud)