嗨,我正在使用离子和火碱构建一个应用程序,这是我的火碱模型:
{
"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 之间的节点。
但是 - 解决方案在结构中提供。随机生成的节点名称也存储在数据中(重复),这可能消除了将其用作键的需要。
将数据上移一级是一种解决方案,因此请将结构更改为:
{
"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"
}
}
}
作为旁注,我建议的结构是"传统"的/users节点在Firebase中的结构。事实证明,它是一致的、可扩展的和可维护的(并且使使用规则来保护数据变得更加容易)。
你的原始结构将是让规则发挥作用的熊。