首页 > 解决方案 > 在 Firebase 实时数据库中排序数据

问题描述

我有这样的表:

"users":{
      "$userUID":{
        "dm":{
            "$roomID":{
                "date":1617755185,
                "lastmessage":"Hi"
            }
        }
      }
}

我想查询房间($roomID)按日期排序所以代码是:

val reference:DatabaseReference = FirebaseDatabase.getInstance().getReference("users").child(FirebaseAuth.getInstance().uid!!).child("dm")
var query:Query = reference.orderByChild("date").startAt($previousRoomId).limitToLast(2)

但是没有数据和消息: Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding '".indexOn": "date"' at users/fDX9PVJpQxXCVoQzOUS7USarVcv2/dm

我试图添加"users":{".indexOn":"date }我的 Firebase 规则,但它没有帮助。我该怎么办?

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


您需要在查询运行的路径上定义该索引。

通过添加"users":{".indexOn":"date" },您定义了一个索引,允许您在其上运行查询/users,然后包含date每个直接子节点的值。这在某些情况下可能有用,但它不是您共享的代码所需的索引。

由于该代码查询/users/$uid/dm您需要在该路径定义索引:

{
  "rules": {
    "users": {
      "$uid": {
        "dm": {
          ".indexOn": "date"
        }
      }
    }
  }
}

上面的$uid 通配符变量表示其下的规则适用于 的每个子节点users,所以每个用户的dm节点都有自己的索引。


推荐阅读