我想在多个数组项的基础上阅读集合。
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();
}
});
我需要阅读所有属于everyDayScience
和generalKnowledge
的问题或多个标签,如物理,化学等。
我的应用程序架构如下。我如何构建我的数据库来读取多个标签上的集合?
编辑我需要有问题的分页,例如,收藏和评论问题。你推荐我This structure
在MongoDb中它是achieved like this
如果您尝试链接多个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。
当您复制数据时,有一件事需要记住。与添加数据的方式相同,您需要对其进行维护。换句话说,如果要更新/检测项目,则需要在其存在的每个位置执行此操作。