Firebase实时数据库:如何正确索引键值对

时间:2018-01-16 14:02:49

标签: java android json firebase firebase-realtime-database

问题

我有这个Firebase实时数据库:

{      
  "groupUsers" : {
    "group1key" : {
      "user1key" : "admin"
    },
    "group2key" : {
      "user1key" : "admin",
      "user2key" : "readonly",
      "user3key" : "readwrite"
    }
  }
}

在我的Android应用中,我像这样查询

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("groupUsers");
ref.orderByChild(auth.getCurrentUser().getUid()).startAt("").addValueEventListener() {...}

产生警告:

  

使用未指定的索引。考虑添加" .indexOn" ...到您的安全和Firebase数据库规则以获得更好的性能

如何正确索引?当数据增长时,我担心我的应用程序将变得非常缓慢地查询未编入索引的数据。

背景

我已经在我的规则文件中尝试索引值:

".indexOn": ".value"

但这只有在数据是标量但它们是键值对("user1key" : "admin")时才有效。

我不能在我的规则文件中添加索引,如下所示:

".indexOn": ["user"]

因为这需要一个像这样的常量属性名称:

{ "groupUsers" : {
    "group1key" : {
      "name" : "user1"
    }        
  }
}

但我有像

这样的名字
"user1key" : "admin",
"user2key" : "readonly",
"user3key" : "readwrite"

1 个答案:

答案 0 :(得分:1)

无法为此类结构预先创建索引。我在答案herehere中介绍了这种类型的结构,而新的Firestore文档(在这方面的工作方式类似)甚至还有documentation page about it

建议以一种允许在另一个方向上进行查找的方式存储数据。使用当前结构,您可以有效地查找组中的用户。要允许查找用户的组,请添加以下结构:

{      
  "usersGroups" : {
    "user1key" : {
      "group1key" : "admin",
      "group2key" : "admin"
    },
    "user2key" : {
      "group2key" : "readonly",
    },
    "user3key" : {
      "group2key" : "readwrite"
    }
  }
}