OrderByChild,equalTo和limitToFirst查询加载整个数据库

时间:2017-06-01 08:01:30

标签: javascript firebase firebase-realtime-database

我正在尝试在firebase中创建一个区域词典应用程序。

数据结构图片:Data structure

OrderByKey和limitToFirst查询分页工作正常,它只加载查询数据。下面的代码示例 -

db.ref('dictionary')
  .orderByKey()
  .startAt(String(this.perpage * (this.page - 1) + 1))
  .limitToFirst(this.perpage)
  .once('value')
  .then((snapshot) => {
    vm.words = []
    snapshot.forEach(function (childSnapshot) {
      var childKey = childSnapshot.key
      var childData = childSnapshot.val()
      childData.id = childKey
      vm.words.push(childData)
    })
    vm.inProgress = false
  })

但是,当我使用orderByChild('word').equalTo(search_query).limitToFirst(3)进行查询时,它会立即获取所有176023条记录(从websocket检查)。以下示例代码 -

db.ref('dictionary')
  .orderByKey()
  .orderByChild('word')
  .equalTo(this.search + '')
  // .startAt(String(25 * (this.page - 1) + 1))
  .limitToFirst(3)
  .on('value', (snapshot) => {
    console.log(snapshot)
    snapshot.forEach(function (childSnapshot) {
      var childKey = childSnapshot.key
      var childData = childSnapshot.val()
      childData.id = childKey
      vm.words.push(childData)
    })
    vm.inProgress = false
  }, (error) => {
    console.log(error)
    vm.inProgress = false
  })

1 个答案:

答案 0 :(得分:1)

您很可能没有DataSourceRegister的索引。当没有索引时,服务器将整个位置发送到客户端,然后客户端进行过滤。在这种情况下,您还会在JavaScript控制台中收到非常明确的警告。

请参阅section in the Firebase documentation on how to define indexes