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



我有这个数据结构,其中待办事项按照路径/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访问这些数据。

相关内容

  • 没有找到相关文章

最新更新