【问题标题】:How do I search a Firebase database reference for a certain value from children within children within children?如何在 Firebase 数据库参考中搜索子中子中子中的某个值?
【发布时间】:2018-10-13 07:17:01
【问题描述】:

我正在尝试在 Firebase 数据库的多个子项中搜索某个值。例如,我有一个名为 collections 的数据库,其中包含不同的集合。这些集合包含不同的植物,这些植物包含植物标签,其中包含我感兴趣的某些值。

My Firebase JSON is included here

我如何搜索特定的植物标签,比如“水”,然后在网页上显示该特定植物的名称和图像,以显示多个植物标签为“水”的植物?

我在想类似的事情

ref.collection.plants.orderbyChild("plantTags").equalTo("water").....

或者它会更复杂,比如遍历所有集合中的所有植物子项,以查看它们是否有一个名为“水”的 plantTags 子项?

我也在用 Vue.js 开发这个项目。

【问题讨论】:

    标签: firebase firebase-realtime-database vue.js


    【解决方案1】:

    这可能有助于保持 Firebase 更浅,即。允许植物成为顶级文档,并为每个植物赋予收集和植物标签的子属性。例如,这应该允许 orderbyChild 按子植物标签 = 水对所有顶级植物进行排序。

    【讨论】:

      【解决方案2】:

      正如 Cuttsy27 建议的那样,您可以对数据进行非规范化处理。实现您的要求的一个好方法是,除了 collections 节点之外,还有一个额外的主节点 plantTags 并为每个带有带有所需信息的植物子节点的子节点创建一个子节点:

      - collections
          - ....
      - plantTags
          - water
            - 1082 <- plantID
               - plantName: "........"
               - plantPic: "xxxxxxxx.png"
            - 362             
               - plantName: "........"
               - plantPic: "xxxxxxxx.png"
          - propagate
            - 362
               - plantName: "........"
               - plantPic: "xxxxxxxx.png"
            - 876             
               - plantName: "........"
               - plantPic: "xxxxxxxx.png"
      

      通过这种方式,很容易查询所有具有给定标签的植物。

      例如在“纯”JavaScript 中:

      var tagToQuery = 'water';
      var ref = database.ref('/plantTags/' + tagToQuery);
      ref.once('value', function(snapshot) {
          snapshot.forEach(function(childSnapshot) {
              var childData = childSnapshot.val();
              console.log(childData.name)
              // ...
          });
      });
      

      为了使两个节点保持同步,请使用update 方法(在此处记录:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields),该方法允许“同时写入节点的特定子节点”

      (简单)数据结构示例:

        var updates = {};
        updates['/collections/0/plants/0'] =  ... ;
        updates['/plantTags/water/362] = ...;
        updates['/plantTags/propagate/362] = ...;
      
        return firebase.database().ref().update(updates);
      

      【讨论】:

      • @Amy 你有时间看看这个解决方案吗?
      【解决方案3】:

      不要使用Array -> 请改用Dictionary。无法在Array 中执行搜索。代替 0, 1, 2 在任何地方使用 自动生成 键。

      然后你可以像这样查询

      collections -> collectionId -> 植物 -> yourQuery

      或者重新定义您的数据库结构,例如您可以获取此内容。在您知道collections (0, 1 or else)plants (0, 1 or else) 的每个索引到达节点之前,使用当前数据库是不可能获取数据的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-05
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 2020-07-11
        • 1970-01-01
        • 2018-04-17
        相关资源
        最近更新 更多