Javascript Firebase:创建按对象id排序的索引
firebase ^2.2.9 Firebase节点如下所示:Javascript Firebase:创建按对象id排序的索引,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,firebase ^2.2.9 Firebase节点如下所示: { articles: { "-KcNAv56MZQAr8a_kJYh": { topic: 'a', text: 'lorem...' }, "-KcNAv5Dd33KE2qfWVFa": { topic: 'a', text: 'lorem...' }, "-KcNAv5IjjTnmXBCeGFi": { topic: 'b'
{
articles: {
"-KcNAv56MZQAr8a_kJYh": {
topic: 'a',
text: 'lorem...'
},
"-KcNAv5Dd33KE2qfWVFa": {
topic: 'a',
text: 'lorem...'
},
"-KcNAv5IjjTnmXBCeGFi": {
topic: 'b',
text: 'lorem...'
},
}
}
firebasepush
命令生成的键。
我想检索最近(按时间顺序)20篇主题为“a”的文章。然后分页
firebase.root.child('articles')
.orderByChild('topic')
.equalTo('a')
.startAt(offset)
.limitToLast(20)
.once('value', snapshot => {...})
无法按两个参数(topic
和key
)排序,因此我假设需要在firebase控制面板中创建一个索引,该索引将按topic
和key
排序文章。那么,如何使其按键
排序
{
"rules": {
"articles": {
".indexOn": ["topic", ???]
}
}
}
Firebase数据库查询只能对单个属性进行排序/筛选 但是在
startAt
和endAt
中还有一些对分页的额外支持。当您筛选多个子节点可能匹配的特定属性值(在您的案例中为主题:“a”)时,您可以指定要在其中启动/结束数据库返回值的项的键。将此键作为第二个参数传递给startAt
或endAt
在您的情况下,这将变成:
ref.child('articles')
.orderByChild('topic')
.startAt('a')
.endAt('a', '-KcNAv5Dd33KE2qfWVFa')
.limitToLast(2)
.once('value', snapshot => {
console.log(snapshot.val());
})
此查询提供了最后两个子节点,其主题为:在item-KcNAv5Dd33KE2qfWVFa
之前和包括item-KcNAv5Dd33KE2qfWVFa
,因此:
“-KcNAv56MZQAr8a_kJYh”
“-KcNAv5Dd33KE2qfWVFa”
有关工作示例,请参见此jsbin:
为了完整起见,这是我定义的唯一索引:
"articles": {
".indexOn": "topic"
}
Firebase数据库查询只能对单个属性进行排序/筛选 但是在
startAt
和endAt
中还有一些对分页的额外支持。当您筛选多个子节点可能匹配的特定属性值(在您的案例中为主题:“a”)时,您可以指定要在其中启动/结束数据库返回值的项的键。将此键作为第二个参数传递给startAt
或endAt
在您的情况下,这将变成:
ref.child('articles')
.orderByChild('topic')
.startAt('a')
.endAt('a', '-KcNAv5Dd33KE2qfWVFa')
.limitToLast(2)
.once('value', snapshot => {
console.log(snapshot.val());
})
此查询提供了最后两个子节点,其主题为:在item-KcNAv5Dd33KE2qfWVFa
之前和包括item-KcNAv5Dd33KE2qfWVFa
,因此:
“-KcNAv56MZQAr8a_kJYh”
“-KcNAv5Dd33KE2qfWVFa”
有关工作示例,请参见此jsbin:
为了完整起见,这是我定义的唯一索引:
"articles": {
".indexOn": "topic"
}
有点离题,但可以,您可以按两个参数进行订购。只需添加另一个子节点将两者绑定在一起:topic_key。例如,主题键:a_KcNAv56MZQAr8a_kJYh,下一个是主题键:a_KcNAv5Dd33KE2qfWVFa。然后查询开始于(a)和结束于(a)。From:“节点的键是自动索引的,因此不需要显式索引。”Jay描述的内容与我在这里的回答类似:。但我不认为这是必要的。有点离题,但是的,你可以按两个参数订购。只需添加另一个子节点将两者绑定在一起:topic_key。例如,主题键:a_KcNAv56MZQAr8a_kJYh,下一个是主题键:a_KcNAv5Dd33KE2qfWVFa。然后查询开始于(a)和结束于(a)。From:“节点的键是自动索引的,因此不需要显式索引。”Jay描述的内容与我在这里的回答类似:。但我不认为这是必要的。由于某些原因,它没有正确地排序。检查:-第一列是我从firebase得到的,正如你所建议的,第二列是字母排序键。如您所见,它们不是按字母顺序从firebase提交的。如果您
.orderByChild('topic')
,结果将按主题排序。除非您共享产生问题的代码(类似于我共享的jsbin),否则我能做的就不多了。检查:-第一列是我从firebase得到的,正如你所建议的,第二列是字母排序键。如您所见,它们不是按字母顺序从firebase提交的。如果您.orderByChild('topic')
,结果将按主题排序。除非您共享产生问题的代码(类似于我共享的jsbin),否则我就无能为力了。