我的.indexOn规则已添加到Security&规则未被考虑在内

时间:2015-04-11 21:19:32

标签: firebase

我尝试在我的firebase数据上设置自定义索引,以便在某些字段上进行排序。

这是我的数据:

获取https://testindexon.firebaseio.com/.json

{ "key1": { "age": 80, "name": "zabc" }, "key2": { "age": 90, "name": "defg" }, "key3": { "age": 10, "name": "hijk" } }

以下是我的安全规则:

{ "rules": { ".read": true, ".write": true, "testindexon": { ".indexOn": "age" } } }

当我尝试订购索引的"年龄"属性,我收到一个错误:

获取https://testindexon.firebaseio.com/.json?orderBy="年龄"

错误400(错误请求)

{ "error": "Index not defined" }

我可以通过重写我的安全规则来解决400错误,如下所示:

{ "rules": { ".read": true, ".write": true, ".indexOn": ["age", "name"] } }

但是当我尝试按其中一个属性订购时,没有什么特别的事情发生(结果没有排序):

GET .... firebaseio.com/.json?orderBy ="年龄"

{ "key1": { "age": 80, "name": "zabc" }, "key2": { "age": 90, "name": "defg" }, "key3": { "age": 10, "name": "hijk" } }

我错过了什么吗?我将不胜感激任何帮助。

最佳,

状态变量

2 个答案:

答案 0 :(得分:5)

根据Firebase documentation on retrieving data through its REST API

  

REST API返回未完成的结果

     

JSON解释器不对结果集强制执行任何排序。虽然orderBy可以与startAt,endAt,limitToFirst或limitToLast结合使用以返回数据的子集,但返回的结果将不会被排序。因此,如果排序很重要,可能需要手动对结果进行排序。

在该文档中确实存在样本和其他片段,似乎不同。但上述说法是正确的。

请注意,orderBy参数不仅仅用于返回有序结果。您还可以使用该方法过滤结果,即

GET 'https://testindexon.firebaseio.com/.json?orderBy="age"&equalTo=90'

或者您会命令返回有限数量的结果:

GET 'https://testindexon.firebaseio.com/.json?orderBy="age"&limitToFirst=10'

因此,在这些情况下,子节点在服务器上排序然后进行过滤,但返回值将/可能仍包含未确定顺序的剩余子节点。

答案 1 :(得分:0)

在我看来,你的.indexOn是在错误的道路上。您正在获取root,但将.indexOn放在子路径testindexon/下。因此,您的网址必须为https://testindexon.firebaseio.com/testindexon/.json才能利用orderBy。