Указание индекса в масштабе в базе данных

В настоящее время я пытаюсь 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 это означает, что вам нужно изменить (или дополнить) структуру данных в соответствии с потребностями вашего приложения. Немного неясно, каков ваш текущий вариант использования, но я вижу это:

  1. какая команда имеет игрока с самым высоким sortTotal?
  2. какой игрок во всех командах имеет самый высокий sortTotal?
  3. какой игрок в команде 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'),

Другие вопросы по тегам