当前位置: 首页 > 知识库问答 >
问题:

Firebase:如何为同一个键查询检索两个值?

罗甫
2023-03-14

我想做的是用同一个键查询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”。

我在网上搜索过,但没有发现任何积极的方面。

共有3个答案

曹高阳
2023-03-14

正如@PeterHaddad在他的回答中提到的,不幸的是Firebase中没有操作员。如果你说你不能切换到Firestore,因为这是一个简单的操作,你需要知道我们有一个解决方案,可以帮助你实现同样的目标。因此,要解决这个问题,可以创建一个复合节点,该节点可以容纳语言属性设置为enfr的所有对象。您的数据库结构应该如下所示:

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

我建议您也使用它来记录节点,而不是将这些对象存储到数组中。

这种做法被称为非规范化,是Firebase的常见做法。为了更好地理解,我建议大家看看这段视频,Firebase数据库的非规范化是正常的。

此外,在复制数据时,有一件事需要记住。与添加数据的方式相同,您也需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。

公冶智刚
2023-03-14

过滤客户端上的语言。

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';
  });
});
严柏
2023-03-14

您不能在firebase数据库中使用AND子句,您只能查询一种语言,因此您只能执行以下操作:

orderByChild("language").equalTo("en")
 类似资料:
  • 问题内容: 如何合并这两个SQL语句? 两个表中都存在hits10,hits11和hits12。 问题答案: 使用UNION查询-只需在两个查询之间填入“ UNION”即可: 更新 将联合包装在另一个查询中:

  • 我正在使用MongoDB,我最终得到了两个集合(无意中)。 第一次收集(样本)有1亿条记录(推文),结构如下: 第二个集合(用户)拥有来自tweet集合的3000万条独特用户记录,看起来是这样的 用户集合中的_id是来自推文集合的user.screen_name,目标是他们的状态(是否作弊用户),最后value.count是我们第一个集合(样本)集合中出现的用户数量(例如捕获的推文数量) 现在我想

  • 我有两个查询,它们都是分开工作的,但是当我尝试统一下摆时,我只有问题。 查询1: 查询 2: 如何根据(内部一)统一它们?

  • 问题内容: 结合这两个查询的正确语法是什么? 和 我试过了: 但我收到“ UNION和ORDER BY的用法不正确”。 编辑 此外,我希望结果在一行中返回。这样我就可以访问php中的值,例如 根据西蒙的建议,我不应该使用UNION,因为我想返回一行数据 问题答案: 您不能先进入,然后再进入。 编辑 但是你可以 将ORDER BY或LIMIT应用于单个SELECT,将子句放在包围SELECT的括号内

  • 我有以下型号 我试图通过名称和组名称获得一个实例。 我可以用下面的代码来做 但是我想把它变成一个查询。对如何实现这一点有什么想法吗?

  • 问题内容: 我有两个查询,如下所示: 我想一次执行两个查询。 但是,然后告诉我如何处理每个单独设置的表。实际上,在ASP.NET中,我们使用数据集来处理两个查询, 如何使用PHP / MYSQL做同样的事情? 问题答案: 更新: 显然可以通过将标志传递给。请参阅使用PHP在一条语句中执行多个SQL查询。尽管如此,任何当前的读者都应避免使用-class函数,而更喜欢PDO。 您无法使用PHP中的常规