Указание индекса в масштабе в базе данных
В настоящее время я пытаюсь orderByChild
см. некоторые примеры данных ниже.
{
"teams": {
"blue":{
"tomsmith":{
"firstName":"Tom",
"lastName":"Smith",
"sortTotal":-433,
"total":433
},
"bobsmith":{
"firstName":"Bom",
"lastName":"Smith",
"sortTotal":-133,
"total":133
}
},
"red":{
"tomkelly":{
"firstName":"Tom",
"lastName":"Kelly",
"sortTotal":-1433,
"total":1433
},
"davekelly":{
"firstName":"Dave",
"lastName":"Kelly",
"sortTotal":-99,
"total":99
}
}
}
}
Когда я просматриваю консоль, я получаю следующее сообщение.
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "sortTotal" at /teams/blue to your security rules for better performance.
Я могу исправить эту проблему, добавив ниже в мой файл правил безопасности.
"teams": {
"blue": {".indexOn": "sortTotal"},
"red": {".indexOn": "sortTotal"}
}
Но что, если у меня много команд или что, если мое приложение позволяет пользователям добавлять свою команду? Как я могу справиться с этим?
Можете ли вы глобально установить индекс? например, для этой базы данных я хочу установить индекс на всех узлах с sortTotal
поле. Или вы можете сделать это на родительском уровне, например
"teams": {".indexOn": "sortTotal"}
будет также применяться ко всем узлам команды без индивидуального указания? (Я попробовал это, и это не сработало)
1 ответ
Упорядочивание и индексация работают только на один уровень ниже. Поскольку вы определяете индекс для sortTotal
на /teams
, он будет только индексировать sortTotal
значение для /teams/red
а также /teams/blue
,
Как обычно, с базами данных NoSQL это означает, что вам нужно изменить (или дополнить) структуру данных в соответствии с потребностями вашего приложения. Немного неясно, каков ваш текущий вариант использования, но я вижу это:
- какая команда имеет игрока с самым высоким
sortTotal
? - какой игрок во всех командах имеет самый высокий
sortTotal
? - какой игрок в команде
red
имеет самый высокийsortTotal
?
какая команда имеет игрока с самым высоким sortTotal
?
Для случая 1 вы можете добавить highSortTotalValue
а также highestSortTotalPlayer
каждой команде.
"teams": {
"blue":{
"highSortTotalValue":-433,
"highestSortTotalPlayer": "tomsmith"
},
"red":{
"highSortTotalValue":-1433,
"highestSortTotalPlayer": "tomkelly"
}
}
Вы можете индексировать это на /teams
а затем запрос ref.child('teams').orderByChild('highSortTotalValue').on(...
,
какой игрок во всех командах имеет самый высокий sortTotal
?
Если вы хотите узнать общее количество сортировки игроков во всех командах, вам нужно сохранить список этих значений для каждого игрока:
"playerSortTotals": {
"tomsmith": -433,
"tomkelly": -1433,
"bomsmith": -133,
"davekelly": -99
}
Теперь вы можете добавить индекс /playerSortTotals
и найти самую высокую сумму сортировки с ref.child('playerSortTotals').orderByValue()...
какой игрок в команде red
имеет самый высокий sortTotal
?
Это возможно с вашей текущей структурой данных. Сначала вам нужно добавить индекс для каждой команды:
"teams": {
"$teamid": {
"$playerid": {
".indexOn": "sortTotal"
}
}
}
Этот индекс заполняется для каждой команды и содержит sortTotal
для каждого игрока этой команды.
С этим индексом вы можете сделать запрос с ref.child('teams/red').orderByChild('sortTotals')
,