Mar*_* Dz 6 firebase flutter google-cloud-firestore
我希望有人可以帮助我完成以下实现:我只想从 firestore 检索随机文档。
按照这个使用自动 ID 版本的流行指南,我使用自动生成的文档 ID 并将它们保存为 field id。
Firestore:如何获取集合中的随机文档
[..]自动 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/example和https://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)
对于 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)
| 归档时间: |
|
| 查看次数: |
2222 次 |
| 最近记录: |