Question
我有这个 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"
无法为这种结构预先创建索引。我在我的回答中介绍了这种类型的结构here http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value and here https://stackoverflow.com/questions/41527058/many-to-many-relationship-in-firebase新的 Firestore 文档(在这方面的工作原理类似)甚至有一个关于它的文档页面 https://firebase.google.com/docs/firestore/solutions/arrays.
建议以允许在另一个方向进行查找的方式存储数据。使用当前的结构,您可以有效地查找组中的用户。为了还允许查找用户的组,请添加以下结构:
{
"usersGroups" : {
"user1key" : {
"group1key" : "admin",
"group2key" : "admin"
},
"user2key" : {
"group2key" : "readonly",
},
"user3key" : {
"group2key" : "readwrite"
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)