javascript - 使用 Firebase 实时数据库查询子级中的嵌套值,其中键是随机的

标签 javascript firebase firebase-realtime-database

我在查询 Firebase 实时数据库中的嵌套数据时遇到问题。

给出以下示例数据结构:

"crossing":
        "1346":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-1"
        "1562":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-1"
        "1933":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-2"

假设该集合将有数百个子集合。此外,ID 是随机的,并且在查询执行之前是未知的。正如您在图片中看到的那样,每个十字路口都有几个其他值。

首先,我必须列出以给定值开头的所有交叉点。 因此,例如,如果我搜索“1”,我希望获得这个简单示例中的所有交叉点。

这段代码解决了这个问题。尽管如此,我仍然不确定这是否是实现这一目标的最佳方法。

firebase
  .database()
  .ref("crossing")
  .orderByKey()
  .startAt(self.searchedKey)
  .endAt(self.searchedKey + "\uf8ff")
  .once("value", function(snapshot) {
    if (snapshot.val()) {
      console.log(snapshot.val());
    }
  });
<小时/>

我的主要问题是,现在我必须列出 projectName 值以给定值开头的所有交叉点。

但是,我无法为此编写正确的查询。我无法使用 .orderByChild() 函数,因为子键(ID)未知。

我无法查询集合中的所有交叉点并迭代前端的所有元素,因为稍后该对象将变得巨大且具有大量交叉点。据我所知,某种顺序仍然是必须的。

最佳答案

Firebase 实时数据库只能对每个子节点中的一个值进行排序/过滤。它可以是每个节点的键 (orderByKey())、其值 (orderByValue()),也可以是每个节点下已知路径处的单个属性的值节点 (orderByChild("path/to/property"))。您可以使用其中任何一个,但只能将其中一个用于任何查询。

如果要过滤多个属性(作为 AND),通常可以将要过滤的值组合到单个(合成)属性中。例如,您还可以在属性中添加每个节点的键,并将其与项目名称组合成:"projectName_key": "PN-1_ 1346",然后对其进行排序/过滤属性。

有关此方法和其他方法的更长示例,请参阅我的答案:Query based on multiple where clauses in Firebase

关于javascript - 使用 Firebase 实时数据库查询子级中的嵌套值,其中键是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60818288/

相关文章:

javascript - 获取推送后创建的对象的 key (Angular 和 Firebase)

javascript - 添加包含下拉列表和动态内容的 div,以及更多 JS

javascript - 单次输入表单如何避免重复提交?

javascript - jQuery 自动完成 - 传递值而不是名称

java - Firebase实时数据库: Is there a way to get value from different node?

ios - 如何更新 Firebase-Database 树中的最新条目?

angular - 如何使用 Angular 从 firebase 中删除用户帐户

javascript - InitSelection 在 Select2 4.0.3 js 中不起作用

java - 在 Firebase Android 中将带有子项的值转换为 Java 对象

ios - 如何使用 Swift 和 Firebase 在我的数据库中搜索特定项目?