结构化Firestore Android可以在多个检查位置上获取

问题描述 投票:0回答:1

我想在多个数组项的基础上阅读集合。

db.collection("questionCollection")
                .orderBy("questionID", Query.Direction.DESCENDING)
                .whereArrayContains("tags","EveryDayScience")
                //.whereArrayContains("tags","generalKnowledge")//this cannot be possible
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        if (queryDocumentSnapshots.isEmpty()) {
                            Log.d(TAG, "onSuccess: LIST EMPTY");
                            return;
                        } else {
                            // Convert the whole Query Snapshot to a list
                            // of objects directly! No need to fetch each
                            // document.
                            questionList = queryDocumentSnapshots.toObjects(QuestionBO.class);
                        }
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();
                Toast.makeText(mContext,"Failed",Toast.LENGTH_LONG).show();
            }
        });

我需要阅读所有属于everyDaySciencegeneralKnowledge的问题或多个标签,如物理,化学等。

我的应用程序架构如下。我如何构建我的数据库来读取多个标签上的集合?

enter image description here

编辑我需要有问题的分页,例如,收藏和评论问题。你推荐我This structure

在MongoDb中它是achieved like this

java android firebase google-cloud-firestore
1个回答
1
投票

如果您尝试链接多个whereArrayContains()方法,您很可能会收到以下错误:

引起:java.lang.IllegalArgumentException:无效的查询。查询仅支持具有单个包含数组的过滤器。

所以不幸的是Firestore只允许一次调用whereArrayContains()方法。在这种情况下,您应该考虑通过添加tagCollection中的每个标记对象(文档)来扩充数据库结构以允许反向查找,tagQuestion是一个名为Firestore-root | --- tagCollection (collection) | --- EveryDayScience (document) | | | --- tagQuestions (collection) | | | --- tagQuestionId | | | --- //question details | --- generalKnowledge (document) | --- tagQuestions (collection) | --- tagQuestionId | --- //question details 的新集合,您应在其中添加标有特定标记的所有问题。您的数据库结构应如下所示:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query firstQuery = rootRef.collection("tagCollection").document("EveryDayScience").collection("tagQuestions");
Query firstQuery = rootRef.collection("tagCollection").document("generalKnowledge").collection("tagQuestions");

Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();

Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
         //Do what you need to do with the list of questions from within two tags
    }
});

要从两个特定标签中获取所有问题,请使用以下代码行:

denormalization

但你会想,为什么要这样做?为什么要复制数据?好吧,对于Firebase来说,重复数据没有问题。这是一个很常见的做法,名为Denormalization is normal with the Firebase Database,为此,我建议你看这个视频,qazxswpoi。这适用于实时数据库,但同样的原则适用于Cloud Firestore。

当您复制数据时,有一件事需要记住。与添加数据的方式相同,您需要对其进行维护。换句话说,如果要更新/检测项目,则需要在其存在的每个位置执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.