【问题标题】:Randomly get documents from Firestore从 Firestore 随机获取文档
【发布时间】:2020-01-08 17:13:13
【问题描述】:

我正在按照this 的方法获取 3 个随机文档,这些文档存储在 Firestore 的集合中。

我使用第一种方法从 8 个随机类别中选择 3 个,效果很好。我的应用程序的下一步是用户单击 3 个类别之一,然后它应该从所选类别中获得 3 个随机问题,并将其显示在“类别选择”片段之后的片段中。我注意到我不能使用第一种方法,因为这最终会导致大量阅读,因为最终每个类别都会有至少 500 个问题。

显然有一种更有效的方法来获取随机问题(第二种方法),但我很难理解它。它说我应该创建另一个文档作为一个数组,它可以在里面保存所有问题 id,但是我如何将所有问题 id 添加到这个数组中?我不知道代码最终会是什么样子。

这是我存储问题的方式:

当我正确理解第二种方法时,我必须将文档中问题的所有 id 存储为数组,但是如何将所有 id 放入数组中?除了使用云功能还有其他方法吗?所以我需要的是上面链接中描述的第二种方法的代码实现或如何实现该方法的示例。

非常感谢任何帮助!

这是我的方法代码:

...
questionRef.document(tvCat1).collection(tvCat1).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {

                            List<Questions> questionsList = new ArrayList<>();
                            for (DocumentSnapshot document : task.getResult()) {
                                Questions question = document.toObject(Questions.class);
                                questionsList.add(question);
                            }

                            int questionListSize = questionsList.size();
                            List<Questions> randomQuestionsList = new ArrayList<>();
                            for (int i = 0; i < questionListSize; i++) {
                                Questions randomQuestions = questionsList.get(new Random().nextInt(questionListSize));
                                if (!randomQuestionsList.contains(randomQuestions)) {
                                    randomQuestionsList.add(randomQuestions);
                                    if (randomQuestionsList.size() == 3) {

                                        Collections.shuffle(questionsList);

                                        question1 = questionsList.get(0).getQuestion();
                                        question2 = questionsList.get(1).getQuestion();
                                        question3 = questionsList.get(2).getQuestion();

                                        answer1 = questionsList.get(0).getAnswer();
                                        answer2 = questionsList.get(1).getAnswer();
                                        answer3 = questionsList.get(2).getAnswer();
...

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    显然有一种更有效的方法来获取随机问题(第二种方法)

    实际上,我回答了这个问题,是的,这是正确的。第二种方法效率更高。

    它说我应该创建另一个文档作为一个数组,其中可以包含所有问题 ID,但是我如何将所有问题 ID 添加到这个数组中?

    有两种方法可以实现这一目标。第一个是在创建问题数据库时在数组中添加问题的 id。这意味着每次向数据库添加新问题时,将其对应的 id 添加到该数组中。这可以使用如下所示的一行代码来完成:

    documentRef.update("questions", FieldValue.arrayUnion("newQuestionId"));
    

    当我正确理解第二种方法时,我必须将文档中问题的所有 id 作为数组存储,但是如何将所有 id 放入数组中?

    第二种方法,如果您已经将所有问题添加到数据库中,那么您应该遍历问题集合get all documents IDs 并创建该数组。另请注意一件事,一旦您在想要添加另一个问题时使用所有 ID 填充数组,您应该再次使用解决方案一,以使集合中的问题与您的数组保持同步。

    除了使用云功能还有其他方法吗?

    如果您愿意,也可以使用 Cloud Functions。我刚刚向你展示了如何在客户端解决这个问题。

    【讨论】:

    • 再次感谢您的帮助!
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2018-03-29
    • 2021-11-02
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多