我要做的是用相同的键查询Firebase的两个值。我的数据库是这样的:
"Document" : [ {
"fileType" : "PDF",
"language" : "en",
"linkUrl" : "https://myfile.pdf",
"name" : "Installation Guide"
}, {
"fileType" : "DOCUMENT",
"language" : "fr",
"linkUrl" : "https://myfile.txt",
"name" : "text.txt"
}我在我的Android项目中编写了一个查询,以检索所有使用同一种语言的文档,并且它可以工作。
val selectedLanguage = LocalStorageHelper.getInstance(this)?.getSelectedLanguage()
val docRef = rootRef.child("Document").orderByChild("language").equalTo("en")但现在我想做的是,寻找"en“和"fr”。
是否可以像上面这样做,我已经在网上搜索,但没有发现任何积极的这一点。
发布于 2018-06-20 12:17:43
不能在firebase数据库中使用AND子句,只能对一种语言进行查询,因此只能:
orderByChild("language").equalTo("en")发布于 2018-06-20 12:46:01
过滤客户端上的语言。
val docRef = rootRef.child("Document").orderByChild("language").on('value', function(snapshot) {
val filteredDocuments = snapshot.val().filter(function(document) {
return document.language === 'en' || document.language === 'fr';
});
});发布于 2018-06-20 12:57:51
正如@PeterHaddad在他的答复中提到的那样,不幸的是,Firebase中没有AND操作符。如果您说您不能在这是一个简单操作的情况下进行修复,那么您需要知道,我们有一个解决办法,可以帮助您实现相同的目标。因此,要解决这个问题,可以创建一个复合节点,该节点可以保存将语言属性设置为en或fr的所有对象。数据库结构应该如下所示:
Firebase-root
|
--- EnFrDocuments
| |
| --- documentId
| | |
| | --- fileType: "PDF"
| | |
| | --- language: "en"
| | |
| | --- linkUrl: "https://myfile.pdf"
| | |
| | --- name : "Installation Guide"
| |
| --- documentId
| |
| --- fileType: "DOCUMENT"
| |
| --- language: "fr"
| |
| --- linkUrl: "https://myfile.txt"
| |
| --- name : "myfile.txt"
|
--- Documents
|
--- //use the same structure结构,我建议您也将其用于Document节点,而不是将其存储到数组中。
这种做法称为denormalization,在Firebase方面是一种常见的做法。为了更好的理解,我建议你看这个视频,在Firebase数据库中,取消规范化是正常的。
另外,当您复制数据时,有一件事需要记住。以同样的方式添加数据,您需要维护它。换句话说,如果你想更新/确认一个项目,你需要在它存在的每一个地方做它。
https://stackoverflow.com/questions/50947856
复制相似问题