javascript - Firebase orderByChild 问题

标签 javascript ionic-framework firebase

您好,我正在使用 ionic 和 firebase 构建一个应用程序,这是我的 firebase 模型:

{
  "users" : {
    "D972XU" : {
      "8b91cc58-a962-4753-abd9-896b8a9418d5" : {
        "email" : "jim@aol.com",
        "house_key" : "D972XU",
        "username" : "jim"
      },
      "8ea6537a-6385-4797-8fc3-62e9e5f06ac6" : {
        "email" : "george@gmail.com",
        "house_key" : "D972XU",
        "username" : "george"
      }
    },
    "V1OVU5" : {
      "f4f283c0-f503-4d50-8af8-7a9ad592ca74" : {
        "email" : "john@yahoo.com",
        "house_key" : "V1OVU5",
        "username" : "john"
      }
    },
    "YOKSPN" : {
      "891bb612-4666-4095-be62-87c81f65c895" : {
        "email" : "jeff@gmail.com",
        "house_key" : "YOKSPN",
        "username" : "jeff"
      }
    }
  }
}

在模型中,用户存储在随机生成的字符串下。我的问题是我正在尝试使用 firebase 文档中的以下代码查找字符串的值:

var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
ref.orderByChild("height").on("child_added", function(snapshot) {
  console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall");
});

我的版本:

app.factory('fireBaseData', function($firebase) {
  var usersRef = new Firebase("https://mynextapp.firebaseio.com/users");
  return {
        ref: function() {
            return ref;
        }
      };
});

app.controller('LoginCtrl', function($scope, $state, fireBaseData) {
  fireBaseData.usersRef().child(authData.uid).orderByChild("email").on("child_added", function(snapshot) {
            console.log(snapshot.key());
          });
  });

根据文档,您不需要知道特定恐龙/字符串的值即可访问其详细信息。但是,该代码对我不起作用。请帮忙?

请注意,/users、D972XU、V10VU5 和 YOKSPN 的子节点是随机生成的。

最佳答案

如果你想根据子值返回一个节点(键),代码如下:

var ref = new Firebase("https://mynextapp.firebaseio.com/users/D972XU");
ref.orderByChild("username").equalTo("jim").on("child_added", function(snapshot) {
  console.log(snapshot.key());
});

或用于邮件

var ref = new Firebase("https://mynextapp.firebaseio.com/users/D972XU");
ref.orderByChild("email").equalTo("jim@aol.com").on("child_added", function(snapshot) {
  console.log(snapshot.key());
});

在这种情况下,您的/users 节点具有随机生成的直接子节点,并且您要查找的数据位于这些子节点内。因此,查询无法“到达”您的数据,因为它太深了。即使是深度查询也需要更多信息才能工作。所以你有:

/users/random_node_name/uid

所以这个

fireBaseData.usersRef().child(authData.uid)

不起作用,因为它忽略了用户和 authData.uid 之间的节点。

但是 - 结构中提供了解决方案。随机生成的节点名称也存储在数据中(重复),这可能不需要将其用作 key 。

将数据上移一级是一种解决方案,因此将结构更改为:

    {
      "users" : {
          "8b91cc58-a962-4753-abd9-896b8a9418d5" : {
            "email" : "jim@aol.com",
            "house_key" : "D972XU",
            "username" : "jim"
          },
          "8ea6537a-6385-4797-8fc3-62e9e5f06ac6" : {
            "email" : "george@gmail.com",
            "house_key" : "D972XU",
            "username" : "george"
          },
          "f4f283c0-f503-4d50-8af8-7a9ad592ca74" : {
            "email" : "john@yahoo.com",
            "house_key" : "V1OVU5",
            "username" : "john"
          },
          "891bb612-4666-4095-be62-87c81f65c895" : {
            "email" : "jeff@gmail.com",
            "house_key" : "YOKSPN",
            "username" : "jeff"
          }
        }
    }

顺便说一句,我建议的结构是 Firebase 中/users 节点的“传统”结构。事实证明,它具有一致性、可扩展性和可维护性(并且使使用规则来保护数据变得更加容易)。

您原来的结构将难以让规则发挥作用。

关于javascript - Firebase orderByChild 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35804706/

相关文章:

Javascript 返回月份为 9,其中 10

javascript - Alfresco Action - 使用 Action 将文件转换为 PDF

javascript - WebStorm 运行非常非常非常慢并且不断给出内存不足错误

ios - ionic 电容器在 ios 13.3 设备上部署应用程序卡住启动画面

angular - Ionic4:在Web应用程序中播放音频文件时出现问题

javascript - 如何在 native react 中显示两个 Firestore 集合中的数据

android - 火力地堡安卓 : Retrieve post from current user's friends only

firebase - 如果我第二天打开应用程序,Firestore 是否会再次收取文档读取费用?

javascript - 以更好的方式重新配置我的脚本

javascript - CodeMirror:有没有办法通过单击 Esc 按钮来存在搜索模式