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

时间:2014-08-12 19:51:53

标签: json firebase angularfire

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

3 个答案:

答案 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访问此数据。