Firebase:创建按对象ID排序的索引

时间:2017-02-08 13:54:31

标签: javascript firebase firebase-realtime-database

火力^ 2.2.9

Firebase节点如下所示:

{
  articles: {
    "-KcNAv56MZQAr8a_kJYh": {
      topic: 'a',
      text: 'lorem...'
    },
    "-KcNAv5Dd33KE2qfWVFa": {
      topic: 'a',
      text: 'lorem...'
    },
    "-KcNAv5IjjTnmXBCeGFi": {
      topic: 'b',
      text: 'lorem...'
    },
  }
}

firebase push命令生成的密钥。 我想检索最后(按时间顺序排列)20篇主题为“a”的文章。然后分页。

firebase.root.child('articles')
    .orderByChild('topic')
    .equalTo('a')
    .startAt(offset)
    .limitToLast(20)
    .once('value', snapshot => {...})

没有办法按两个参数(topickey)订购,所以我假设我需要在firebase控制面板中创建一个索引,它将按topic订购文章并由key。那么,我如何通过key订购它?

{
  "rules": {
    "articles": {
      ".indexOn": ["topic", ???]
    }
  }
}

1 个答案:

答案 0 :(得分:0)

Firebase数据库查询只能对单个属性进行排序/过滤。

startAtendAt对分页有一些额外的支持。当您筛选许多子节点可能匹配的特定属性值(在您的情况下为topic: 'a')时,您可以指定要在其中数据库开始/结束返回值的项的键。您将此密钥作为第二个参数传递给startAtendAt

在你的情况下,这变成:

ref.child('articles')
    .orderByChild('topic')
    .startAt('a')
    .endAt('a', '-KcNAv5Dd33KE2qfWVFa')
    .limitToLast(2)
    .once('value', snapshot => {
      console.log(snapshot.val());
    })

此查询为最后2个子节点提供topic: 'a' 之前和之后项目-KcNAv5Dd33KE2qfWVFa,因此:

  

“ - KcNAv56MZQAr8a_kJYh”

     

“ - KcNAv5Dd33KE2qfWVFa”

有关工作示例,请参阅此jsbin:http://jsbin.com/bovuyetoki/edit?js,console

为了完整起见,这是我定义的唯一索引:

  "articles": {
    ".indexOn": "topic"
  }