如何在所有子项中查询具有特定值的属性的firebase

 营帐水狂_836 发布于 2022-12-28 15:55

我有这个数据结构,其中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),我应该怎么做?或者我应该更多地反规范化并安排路径/私人以避免走下去待办事项?

2 个回答
  • 假设你有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);
    

    这里有关于复杂查询的更多信息的参考,并且如其他响应中所提到的,可以通过优先级和重构来完成一些很好的优化.

    快乐的编码!

    2022-12-28 15:57 回答
  • WHEREFirebase 中没有任何条款.查看此主题以获取有关按多个字段搜索的一些重要结构提示,此线程在数据库样式查询,此博客上的查询以及文档.

    您的第一种方法应该是将数据分段回读.类似于以下内容:

    /todos/public
    /todos/private
    /todos/completed
    

    您还可以使用文档中说明的优先级.然后根据优先级获取项目.

    如果列表少于一千,如果数据被正确分区应该是这样的,你可以抓住todo列表并在客户端过滤它 - 对于这样的短集合来说是一个很好的选择,特别是在使用时一个伟大的绑定库,如Angular.

    2022-12-28 15:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有