Как работает indexOn в базе данных firebase?

Моя база данных выглядит следующим образом:

"users": {
    "2387653478": {
        "score": 1000,
        ...
    },
    "8456756547": {
        "score": 2000,
        ...
    },
    ...
}

Я хочу сделать простую ранжирование по «оценке», но у меня много пользователей, и я должен добавить indexOn в правила для оптимизации:

"rules": {
    "users": {
        "$user": {
            ".read": "auth != null",
            ".write": "auth != null && auth.token.firebase.identities['facebook.com'][0] === $user",
            ".indexOn": ["score"]
        }
    }
}

Оптимизация работает на 100% только при добавлении indexOn в правила? Как насчет пользователей, созданных до добавления indexOn?

Заранее спасибо!


person Joyco Games    schedule 03.04.2017    source источник


Ответы (1)


Когда вы обновляете файл правил (либо через консоль базы данных Firebase или через интерфейс командной строки), база данных Firebase (повторно) создает все индексы, определенные в правилах. Он делает это для всех существующих данных, а затем продолжает обновлять эти индексы при любых изменениях данных.

Но вы определили индекс не на том уровне. Вы хотите разрешить запросы к узлу users на счетах отдельных пользователей. Итак, вам нужно определить индекс для users:

"rules": {
    "users": {
        ".read": "auth != null",
        ".indexOn": ["score"]
        "$user": {
            ".write": "auth != null && auth.token.firebase.identities['facebook.com'][0] === $user",
        }
    }
}

Вы заметите, что я также переместил ваше правило .read на users. Потому что без этого у вас не было бы разрешения на чтение /users и, следовательно, вы не могли бы запросить его.

person Frank van Puffelen    schedule 03.04.2017
comment
Спасибо за быстрый ответ! Процесс воссоздания займет несколько секунд. Будут ли проблемы, если в это время база данных получит запросы на изменение пользователя? - person Joyco Games; 03.04.2017
comment
Если у вас возникли проблемы, предоставьте шаги, которые воспроизводят эти проблемы. - person Frank van Puffelen; 03.04.2017
comment
Я попросил предотвратить проблемы от текущих пользователей. Никаких проблем на данный момент. Спасибо! - person Joyco Games; 04.04.2017
comment
Что делать, если [score] вложен более одного раза в разных местах внутри пользователей? Как FB узнает, на каком из них размещать индекс? - person GuyC; 31.08.2017
comment
Каждый дочерний узел users может иметь только одно дочернее свойство score. Это значение, которое Firebase индексирует с помощью вышеуказанных правил. - person Frank van Puffelen; 31.08.2017