我希望有人能帮助我完成以下的实现:我只是想从消防局中检索一个随机文档。
按照这个使用自动Id版本的流行指南,我使用自动生成的文档Id,并将它们保存为字段id。Firestore:如何在集合中获取随机文档
.自动Id版本--如果您使用的是在我们的客户端库中提供的随机生成的自动Id,您可以使用相同的系统随机选择一个文档。在这种情况下,随机排序的索引是文档id.
显然,为查询获取一个随机id是很明显的,但对于我来说,作为新手,我不知道在不运行查询的情况下,从什么以及如何在我的_randomIndex中随机获得自动id值。我现在该如何定义我的_randomIndex?
QuerySnapshot querySnapshot = await ref
.where('id', isGreaterThanOrEqualTo: _randomIndex)
.orderBy('id', descending: true)
.limit(1)
.get();解决方案
感谢大家!我认为,对于更多的人来说,如何通过查看上面的指南并使用flutter来实现给定的方法,可能并不简单。
例如,我在颤音中听说了uuid和随机id,总是向我推荐流行的图书库,如https://pub.dev/packages/uuid/example和guid/安装
在我的例子中,它们不起作用,多亏了@Jigar,我们现在可以完美地随机化它。在下面的示例中,我们还可以确定文档的数量:
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;
}发布于 2021-04-06 10:34:39
在自动id版本的情况下,您需要在firebase为新文档创建id的同一个道路中创建一个随机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();
}发布于 2021-04-06 09:46:12
你所链接的帖子提到:
在我们的查询部分后面,您生成的随机值是一个新的自动id (iOS、Android ),您查询的字段是__ name __字段,后面提到的“低值”是一个空字符串。到目前为止,这是生成随机索引的最简单方法,并且不管语言和平台如何工作。
据我所知,您可以使用autoId()方法从Util.java生成一个随机值。这是Firestore用来创建文档Id的相同方法。它将返回一个与随机Id对应的随机字符串。此Id与任何文档不匹配(除非您没有运气,并且该方法生成已分配给文档的随机Id )。然后,通过将random设置为新生成的Id的以下代码进行Id之间的比较:
queryRef = postsRef.whereField("random", isGreaterThanOrEqualTo: random)
.order(by: "random")
.limit(to: 1)发布于 2021-04-06 09:55:34
我不知道这是否是最好的解决方案,我真正想到的是这样一件不那么复杂的事情:
1:从防火墙获取所有特定集合的文档。
2:把它们都列在一个列表中。
3:洗牌整个列表并获得第一个索引。
我想会是这样的:
import 'dart:math'
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
List allDoc = [];
class AllDocs{
String collection = "collectionName";
FirebaseFirestore _firestore = FirebaseFirestore.instance;
Future<List> getAllDocs()async{
_firestore.collection(collection).get().then((result) {
for(DocumentSnapshot docss in result.docs ){
allDoc.add(Model.fromSnapshot(docss));
}
return allDoc;
});
}
final _random = Random();
var element = allDoc[_random.nextInt(list.length)];
print (element);
}https://stackoverflow.com/questions/66966147
复制相似问题