我尝试在我的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"
}
}
我错过了什么吗?我将不胜感激任何帮助。
最佳,
状态变量
答案 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。