Json 如何查询firebase中所有子级中具有特定值的属性
我有这样一个数据结构,其中TODO按照path/todos/uid进行组织/Json 如何查询firebase中所有子级中具有特定值的属性,json,firebase,angularfire,Json,Firebase,Angularfire,我有这样一个数据结构,其中TODO按照path/todos/uid进行组织/ { "metausers" : { "simplelogin:1" : { "displayName" : "John Doe", "provider" : "password", "provider_id" : "1" }, "simplelogin:2" : { "displayName" : "GI Jane", "provi
{
"metausers" : {
"simplelogin:1" : {
"displayName" : "John Doe",
"provider" : "password",
"provider_id" : "1"
},
"simplelogin:2" : {
"displayName" : "GI Jane",
"provider" : "password",
"provider_id" : "2"
}
},
"todos" : {
"simplelogin:1" : {
"-JUAfv4_-ZUlH7JqM4WZ" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "First"
},
"-JUAfveXP_sqqX32jCJS" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : true,
"subject" : "Second"
},
"-JUAfwXnMo6P53Qz6Fd2" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Third"
}
},
"simplelogin:2" : {
"-JUAg9rVemiNQykfvvHs" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Q first"
},
"-JUAgAmgPwZLPr2iH1Ho" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : false,
"subject" : "Q second"
},
"-JUAgBfF8f7V5R5-XgrY" : {
"completed" : false,
"done" : false,
"group" : false,
"private" : true,
"subject" : "Q third"
}
}
}
}
我想查询TODO以获取所有带有
private:true
的记录。这是否可能使用firebase(angularfire)以及我应该如何做到?或者我应该再去规范化一点,安排path/private以避免走到TODO上吗?Firebase中没有WHERE
子句。查看有关按多个字段搜索、数据库样式查询、查询和查询的一些重要结构提示
您的第一种方法应该是对数据进行分段,以了解如何读回数据。如下所示:
/todos/public
/todos/private
/todos/completed
您也可以按照文档中的说明进行操作。然后根据优先级获取项目
如果列表少于1000个(如果数据被正确分区,那么应该是这样),您可能只需要抓取todo列表并在客户端对其进行过滤——这对于这样的短集合是一个很好的选择,特别是在使用Angular这样的绑定库时。Firebaase中的所有数据都可以通过URL访问。
如果您转到Firebase dashboar查看您的数据模型(Forge)并单击您感兴趣的属性,您将被重定向到一个URL,您可以通过该URL访问此特定数据,例如。记住这一点,您可以使用AngularFire访问此数据。假设您有uid,这应该是简单的:
var uid = "simplelogin:1";
var todosRef = new Firebase("https://yourdb.firebaseio.com/todos/" + uid);
var privateTodosRef = todosRef.orderByChild("private").equalTo(true);
var privateTodos;
privateTodosRef.on("value", function(response) {
privateTodos = response.val();
});
这将返回一个包含该用户所有私有todo的对象,该对象由其todo密钥(即“-JUAfv4\uulh7jqm4wz”
)组织。如果要使用Angularfire,可以将其包装在$firebaseArray中,并按如下方式分配:
$scope.privateTodos = $firebaseArray(privateTodosRef);
下面是关于复杂查询的更多信息,正如在其他响应中提到的,有一些很好的优化可以通过优先级和重组来完成
快乐编码!Firebase可以根据节点名称或节点优先级查询数据。如果您的
private
属性既不是这两个属性,则必须将其升级为这两个属性(例如,为每个节点调用setPriority
,值为private
)或者,您必须提供一个按值提供数据列表的索引(例如,包含所有非私有todo名称的节点).看,谢谢你的回答,我明白了。嗨@Denis,我下面的解决方案应该适合你。我将你的JSON导入Firebase进行检查。不确定为什么没有人提到这一点。如果你能为未来的人(像我一样)更新答案,那就太好了谁在这里登陆。也许。orderByChild在2014年不可用,但它肯定在2020年可用,并且可以正常工作。谢谢Matt!谢谢Kato的回答和线程链接。是的,我正在与angular合作,我也计划使用你的帮助工具。我知道我可以像数组一样抓取所有列表,如果不是太大的话,可以过滤它。我只想专注于一个point,但也在尝试寻找其他方法。谢谢你,Alex的回答。是的,我认为在你的回答之后,Katos和Frank
s的回答,我对下一个研究以及如何思考非规范化有了很好的概述。这正是TS(和我)所做的我们正在寻找。请向上投票,因为这应该是正确的答案!事实上,这是筛选数据的唯一方法。语义上不一致,因为语法中没有关于筛选的符号。我认为Firebase目前还缺乏很多真正的word功能。使用Windows构建复杂的数据结构是不现实的在开始时,您可能会考虑查询情况。您可能还必须在数据库规则中添加indexOn字段