首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >颤振修复检索随机存储文档

颤振修复检索随机存储文档
EN

Stack Overflow用户
提问于 2021-04-06 09:35:47
回答 3查看 1.5K关注 0票数 5

我希望有人能帮助我完成以下的实现:我只是想从消防局中检索一个随机文档。

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

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

显然,为查询获取一个随机id是很明显的,但对于我来说,作为新手,我不知道在不运行查询的情况下,从什么以及如何在我的_randomIndex中随机获得自动id值。我现在该如何定义我的_randomIndex

代码语言:javascript
运行
复制
QuerySnapshot querySnapshot = await ref
        .where('id', isGreaterThanOrEqualTo: _randomIndex)
        .orderBy('id', descending: true)
        .limit(1)
        .get();

解决方案

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

例如,我在颤音中听说了uuid和随机id,总是向我推荐流行的图书库,如https://pub.dev/packages/uuid/exampleguid/安装

在我的例子中,它们不起作用,多亏了@Jigar,我们现在可以完美地随机化它。在下面的示例中,我们还可以确定文档的数量:

代码语言:javascript
运行
复制
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;
  }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-06 10:34:39

在自动id版本的情况下,您需要在firebase为新文档创建id的同一个道路中创建一个随机id(用于道路),如下所示。

代码语言:javascript
运行
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2021-04-06 09:46:12

你所链接的帖子提到:

在我们的查询部分后面,您生成的随机值是一个新的自动id (iOS、Android ),您查询的字段是__ name __字段,后面提到的“低值”是一个空字符串。到目前为止,这是生成随机索引的最简单方法,并且不管语言和平台如何工作。

据我所知,您可以使用autoId()方法从Util.java生成一个随机值。这是Firestore用来创建文档Id的相同方法。它将返回一个与随机Id对应的随机字符串。此Id与任何文档不匹配(除非您没有运气,并且该方法生成已分配给文档的随机Id )。然后,通过将random设置为新生成的Id的以下代码进行Id之间的比较:

代码语言:javascript
运行
复制
queryRef = postsRef.whereField("random", isGreaterThanOrEqualTo: random)
                   .order(by: "random")
                   .limit(to: 1)
票数 1
EN

Stack Overflow用户

发布于 2021-04-06 09:55:34

我不知道这是否是最好的解决方案,我真正想到的是这样一件不那么复杂的事情:

1:从防火墙获取所有特定集合的文档。

2:把它们都列在一个列表中。

3:洗牌整个列表并获得第一个索引。

我想会是这样的:

代码语言:javascript
运行
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66966147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档