我有这个数据结构,其中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),我应该怎么做?或者我应该更多地反规范化并安排路径/私人以避免走下去待办事项?
假设你有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);
这里有关于复杂查询的更多信息的参考,并且如其他响应中所提到的,可以通过优先级和重构来完成一些很好的优化.
快乐的编码!
WHERE
Firebase 中没有任何条款.查看此主题以获取有关按多个字段搜索的一些重要结构提示,此线程在数据库样式查询,此博客上的查询以及文档.
您的第一种方法应该是将数据分段回读.类似于以下内容:
/todos/public /todos/private /todos/completed
您还可以使用文档中说明的优先级.然后根据优先级获取项目.
如果列表少于一千,如果数据被正确分区应该是这样的,你可以抓住todo列表并在客户端过滤它 - 对于这样的短集合来说是一个很好的选择,特别是在使用时一个伟大的绑定库,如Angular.