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

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

我有这样一个数据结构,其中TODO按照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"
      }
    }
  }
}

我想查询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的回答。是的,我认为在你的回答之后,Kato
s和Frank
s的回答,我对下一个研究以及如何思考非规范化有了很好的概述。这正是TS(和我)所做的我们正在寻找。请向上投票,因为这应该是正确的答案!事实上,这是筛选数据的唯一方法。语义上不一致,因为语法中没有关于筛选的符号。我认为Firebase目前还缺乏很多真正的word功能。使用Windows构建复杂的数据结构是不现实的在开始时,您可能会考虑查询情况。您可能还必须在数据库规则中添加indexOn字段