Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase:创建按对象id排序的索引_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

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

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'

firebase ^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 => {...})
无法按两个参数(
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),否则我就无能为力了。