我有这个数据结构,其中待办事项按照路径/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"
}
}
}
}
和我想查询todos获得所有记录与private:true
。这是可能的使用firebase (angularfire),我应该怎么做?或者我应该更规范化一点,并安排path/private以避免沿着todos走?
假设您有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_-ZUlH7JqM4WZ"
)进行组织。如果你想使用Angularfire,你可以把它包装在$firebaseArray中,并按如下方式赋值:
$scope.privateTodos = $firebaseArray(privateTodosRef);
这里有一个关于复杂查询的更多信息的参考,正如其他回复中提到的,有一些很好的优化可以通过优先级和重构来完成。
编码快乐!
Firebase中没有WHERE
子句。查看这个线程,了解一些关于多字段搜索的结构技巧,这个线程关于数据库样式查询,这个博客关于查询,以及文档。
你的第一种方法应该是分段数据,它将如何被读回。如下所示:
/todos/public
/todos/private
/todos/completed
你也可以像文档中解释的那样使用优先级。然后根据优先级取项。
如果列表少于1000个,如果数据被正确分区,它应该是少于1000个,你可能只需要抓取todo列表并在客户端过滤它——对于像这样的短集合来说,这是一个很好的选择,特别是当使用像Angular这样的绑定库时。
firebase中的所有数据都可以通过url访问。如果你去你的Firebase dashboar查看你的数据模型(Forge),并点击你感兴趣的属性,你会被重定向到一个URL,通过它你可以访问这个特定的数据,例如https://myapp.firebaseio.com/todos/simplelogin:1/-JUAg9rVemiNQykfvvHs/private。记住这一点,你可以使用AngularFire访问这些数据。