Firebase 将My.indexOn规则添加到安全和;规则不是';没有考虑到

Firebase 将My.indexOn规则添加到安全和;规则不是';没有考虑到,firebase,Firebase,我正试图在firebase数据上设置自定义索引,以便对某些字段进行排序 以下是我的数据: 得到 { “关键1”:{ “年龄”:80岁, “名称”:“zabc” }, “键2”:{ “年龄”:90岁, “名称”:“defg” }, “键3”:{ “年龄”:10岁, “名称”:“hijk” } } 以下是我的安全规则: { “规则”:{ “.read”:正确, “.write”:正确, “testindexon”:{ .indexOn:“年龄” } } } 当我尝试按索引的“年龄”属性排序时,我

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

以下是我的数据:

得到

{
“关键1”:{
“年龄”:80岁,
“名称”:“zabc”
},
“键2”:{
“年龄”:90岁,
“名称”:“defg”
},
“键3”:{
“年龄”:10岁,
“名称”:“hijk”
}
}

以下是我的安全规则:

{
“规则”:{
“.read”:正确,
“.write”:正确,
“testindexon”:{
.indexOn:“年龄”
}
}
}

当我尝试按索引的“年龄”属性排序时,我得到一个错误:

得到“年龄”

错误400(错误请求)

{
“错误”:“未定义索引”
}

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

{
“规则”:{
“.read”:正确,
“.write”:正确,
“.indexOn”:[“年龄”、“姓名”]
}
}

但当我尝试按其中一个属性排序时,没有发生任何特殊情况(结果未排序):

获取…firebaseio.com/.json?orderBy=“age”

{
“关键1”:{
“年龄”:80岁,
“名称”:“zabc”
},
“键2”:{
“年龄”:90岁,
“名称”:“defg”
},
“键3”:{
“年龄”:10岁,
“名称”:“hijk”
}
}

我错过什么了吗?我将感谢任何帮助

最好的

状态变量

根据:

RESTAPI返回未排序的结果

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'

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

在我看来,您的.indexOn路径错误。您正在获取根目录,但将.indexOn放在子路径
testindexon/
下。因此,您的URL必须是
https://testindexon.firebaseio.com/testindexon/.json
以利用orderBy

RESTAPI返回未排序的结果。请看@FrankvanPuffelen,谢谢你的指点。然而,用户文档也在某一点上显示了以下示例:“通过指定的子键排序,我们可以通过将一个公共子键传递给orderBy参数来对节点进行排序。例如,要读取所有按高度排序的恐龙,我们可以执行以下操作:curl…恐龙事实。firebaseio.com/digons.json?orderBy=“height“&print=pretty”(cf)令人困惑!@FrankvanPuffelen该文档还说:“开发不需要索引,除非您使用的是RESTAPI。实时客户端库可以在不指定索引的情况下执行即席查询。性能会随着您查询的数据的增长而降低,因此,如果您希望查询大量数据,则在启动应用程序之前添加索引非常重要。”(cf)因此,我认为我们可能遗漏了一些东西。听起来似乎可以为REST API定义索引……我最初指出的是实际情况:REST API不会以任何特定顺序返回子节点,因为在JSON对象中,您无法定义子节点的顺序。但是,您可以过滤子节点,这是为什么
orderBy…
仍然与REST API相关。我将提交一项任务来改进文档,因为它们在这里确实有点过于通用。因此REST API可以对数据进行排序,这是它过滤数据所需要做的。但是常规REST GET请求无法返回已排序的数据。但正如我所说的:这方面的文档可能更好。OPs second
规则
代码段的
.indexOn
位置正确。