问题
我有这个 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() {...}
这会产生警告:
Using an unspecified index. Consider adding ".indexOn" ... to your security and Firebase Database rules for better performance
如何正确索引?当数据增长时,我担心我的应用程序对未索引数据的查询会变得非常慢。
背景
我已经尝试在我的规则文件中对值进行索引:
".indexOn": ".value"
但只有当数据是标量但它们是键值对("user1key": "admin"
)时,这才有效。
我不能像这样在规则文件中添加索引:
".indexOn": ["user"]
因为这需要一个像这样的常量属性名称:
{ "groupUsers" : {
"group1key" : {
"name" : "user1"
}
}
}
但是我有像名称这样的值
"user1key" : "admin",
"user2key" : "readonly",
"user3key" : "readwrite"
最佳答案
无法为这种结构预先创建索引。我在我的答案 here 中介绍了这种类型的结构和 here新的 Firestore 文档(在这方面的工作原理类似)甚至有一个 documentation page about it .
建议以允许在另一个方向进行查找的方式存储数据。使用当前的结构,您可以有效地查找组中的用户。要还允许查找用户的组,请添加以下结构:
{
"usersGroups" : {
"user1key" : {
"group1key" : "admin",
"group2key" : "admin"
},
"user2key" : {
"group2key" : "readonly",
},
"user3key" : {
"group2key" : "readwrite"
}
}
}
关于java - Firebase 实时数据库 : Howto index properly on key-value pair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283040/