Firebase .indexOn无法按预期工作

时间:2019-06-23 20:34:34

标签: java android firebase firebase-realtime-database

我有一个content节点,可以从Firebase实时数据库中检索该节点。 我利用.orderByChild("time")来获取按最早时间戳排序的前5个博客对象的数据快照。我

我目前正尝试使用.indexOn : "time"来代替,这样我就不必利用.orderByChild("time")了,因为我期望博客对象在检索时已经由其时间戳按后端的时间戳进行排序了。 (我将使用大量博客对象,因此我想在后端使用.indexOn : "time"而不是在前端使用orderByChild("time")来提高效率)。当前,.indexOn无法正常工作,并且在检索数据时未按其时间字段对数据进行排序。

没有.indexOn

的查询
// this works fine
// startAt is utilized for saving last blog object retrieved to retrieve more data

query = 
FirebaseDatabase.getInstance().getReference()
                .child("content")
                .orderByChild("time")
                .startAt(nodeId)
                .limitToFirst(5);

使用.indexOn

进行查询
// this along with the Firebase rules below does not return the same result as above
// startAt is utilized for saving last blog object retrieved to retrieve more data

query = 
FirebaseDatabase.getInstance().getReference()
                .child("content")
                .startAt(nodeId)
                .limitToFirst(5);

Firebase规则:

{
 "rules": {
 ".read": true,
 ".write": true,
 "content" : {
      ".indexOn": "time"
  }
 }
}

Firebase中数据的JSON结构:

"content" : {
"blog-0001" : {
  "content_id" : "blog-0001",
  "image" : "someimage",
  "time" : 13,
  "title" : "title1",
  "type" : "blog"
},
"blog-0002" : {
  "content_id" : "blog-0002",
  "image" : "someimage",
  "time" : 12,
  "title" : "title2",
  "type" : "blog"
},
"blog-0003" : {
  "content_id" : "blog-0003",
  "image" : "someimage",
  "time" : 11,
  "title" : "title3",
  "type" : "blog"
},
"blog-0004" : {
  "content_id" : "blog-0004",
  "image" : "someimage",
  "time" : 15,
  "title" : "title4",
  "type" : "blog"
}
...
}

1 个答案:

答案 0 :(得分:2)

您似乎误解了.indexOn的功能以及它与orderByChild("time")的关系。

要从content排序(并可能对其进行过滤)的time中检索子节点,您将始终需要调用orderByChild("time")

如果您定义索引(使用".indexOn": "time"),则将在服务器上进行排序和过滤。

没有索引,content下的所有数据将被下载到客户端,并且排序/过滤将在客户端执行。

因此.indexOn不能代替orderByChild。取而代之的是,两者协同工作以执行有效的数据排序和过滤。