При запуске моего приложения Android с использованием базы данных Firebase Realtime я получаю следующее предупреждение:
Использование неуказанного индекса. Подумайте о добавлении ".indexOn"... в свои правила безопасности и Firebase для лучшей производительности
Я полностью понимаю предупреждение. Но я не знаю, как сделать это лучше. Я действительно хочу запросить только индексированные поля!
Это моя БД:
{
"groupUsers" : {
"g1" : {
"u1" : "admin"
},
"g2" : {
"u1" : "admin",
"u2" : "readonly"
}
},
"groups" : {
"g1" : {
"areas" : {
"a1" : {
"groupId" : "g1",
"name" : "My Group"
}
},
"interests" : {
"i1" : {
"groupId" : "g1",
"name" : "My Interest"
}
},
"points" : {
"p1" : {
"address" : "First Street",
"areaId" : "a1",
"groupId" : "g1",
"latitude" : -25,
"longitude" : -55,
"name" : "Harry"
}
},
"properties" : {
"name" : "My Group Name"
},
"waypoints" : {
"w1" : {
"areaId" : "a1",
"groupId" : "g1"
}
}
}
}
"users" : {
"u1" : {
"email" : "[email protected]",
"firstName" : "Peter",
"lastName" : "Smith"
},
"u2" : {
"email" : "[email protected]",
"firstName" : "John",
"lastName" : "Wayne"
}
}
}
Это мои правила безопасности:
{
"rules": {
"groups": {
"$groupId": {
".read": "root.child('groupUsers').child($groupId).child(auth.uid).exists()",
".write": "! root.child('groupUsers').child($groupId).exists() || root.child('groupUsers').child($groupId).child(auth.uid).val() === 'admin'",
"$child": {
".write": "root.child('groupUsers').child($groupId).child(auth.uid).exists() && root.child('groupUsers').child($groupId).child(auth.uid).val() !== 'readonly' && ($child === 'points' || $child === 'visits')"
}
},
"areas": {
".indexOn": ["groupId", "name"]
},
"waypoints": {
".indexOn": ["groupId", "areaId", "sequenceNumber"]
},
"interests": {
".indexOn": ["groupId", "rank", "name"]
},
"points": {
".indexOn": ["groupId", "areaId", "name"]
},
"visits": {
".indexOn": ["groupId", "pointId", "interestId", "userId"]
}
},
"users": {
".read": "auth != null",
"$userId": {
".write": "auth != null && $userId === auth.uid && newData.val() != null",
".indexOn": ["email", "firstName", "lastName"]
}
},
"groupUsers": {
".read": "auth != null",
"$groupId": {
".write": "auth != null && (root.child('groupUsers').child($groupId).child(auth.uid).val() === 'admin' || !root.child('groupUsers').child($groupId).exists())"
}
}
}
}
Проблема заключается в структуре groupUser
. Он имеет ключи группы в качестве имен свойств. У меня нет поля для индексации, так как у меня нет постоянного имени свойства.
Как изменить структуру, чтобы можно было проиндексировать все поля и чтобы все мои правила все еще работали?