我有这个数据结构,其中todos被组织为遵循path / todos / uid /
{
"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"
}
}
}
}
我希望查询待办事项以获取private:true
的所有记录。这可能是使用firebase(angularfire),我应该怎么做?或者我应该更多地反规范化并安排路径/私人以避免走下去待办事项?
答案 0 :(得分:55)
假设你有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();
});
这应该返回一个包含所有这个用户的私人待办事项的对象,由他们的待办事项密钥组织(即"-JUAfv4_-ZUlH7JqM4WZ"
。如果您想使用Angularfire,可以将其包装在$ firebaseArray中,并按如下方式分配:
$scope.privateTodos = $firebaseArray(privateTodosRef);
这里有a reference有关复杂查询的更多信息,正如其他回复中所提到的,可以通过优先级和重组进行一些很好的优化。
快乐的编码!
答案 1 :(得分:17)
Firebase中没有WHERE
个子句。查看this thread以获取有关按多个字段搜索的一些重要结构提示,this thread有关数据库样式查询,this blog有关查询和the docs。
您的第一种方法应该是将数据分段回读。如下所示:
/todos/public
/todos/private
/todos/completed
您也可以按照文档中的说明utilize priorities进行操作。然后根据优先级获取项目。
如果列表小于一千,如果数据被正确分区应该是这样的,你可以抓住todo列表并在客户端过滤它 - 这对于像这样的短集合来说是一个很好的选择,特别是使用像Angular这样的优秀绑定库时。
答案 2 :(得分:3)
可以通过网址访问Firebaase中的所有数据。 如果您转到Firebase仪表板查看数据模型(Forge)并单击您感兴趣的属性,您将被重定向到一个URL,您可以通过该URL访问此特定数据,例如https://myapp.firebaseio.com/todos/simplelogin:1/-JUAg9rVemiNQykfvvHs/private。记住这一点,您可以使用AngularFire访问此数据。