2016-11-01 3 views
0

Текущий запрос, который вы видите ниже, не эффективен, потому что я не настроил правильную индексацию. Я получаю предложение Consider adding ".indexOn": "users/kxSWLGDxpYgNQNFd3Q5WdoC9XFk2" at /conversations в консоли в Xcode. Я пробовал это, он работает.Firebase .indexOn со сложной структурой БД

Однако мне нужен идентификатор пользователя после users/, чтобы быть динамичным. Я добавил ссылку на другой пост ниже, который попробовал аналогичную вещь, но я просто не могу ее получить. Вся помощь будет очень признательна!

Примечание: Идентификатор пользователя на выходе консоли не соответствует приведенному ниже скриншоту, но не имеет значения, чтобы решить проблему, на которую я верю. Поправьте меня если я ошибаюсь. Благодаря!

Вот структура моей БД в Firebase:

{ 
    "conversationsMessagesID" : "-KS3Y9dMLXfs3FE4nlm7", 
    "date" : "2016-10-19 15:45:32 PDT", 
    "dateAsDouble" : 4.6601793282986E8, 
    "displayNames" : [ “Tester 1”, “Tester 2” ], 
    "hideForUsers" : [ "SjZLsTGckoc7ZsyGV3mmwc022J93" ], 
    "readByUsers" : [ "mcOK5wVZoZYlFZZICXWYr3H81az2", "SjZLsTGckoc7ZsyGV3mmwc022J93" ], 
    "users" : { 
    "SjZLsTGckoc7ZsyGV3mmwc022J93" : true, 
    "mcOK5wVZoZYlFZZICXWYr3H81az2" : true 
    } 
} 

и Swift запрос:

FIRDatabase.database().reference().child("conversations") 
    .queryOrderedByChild("users/\(AppState.sharedInstance.uid!)").queryEqualToValue(true) 

Ссылки на другие должности: How to write .indexOn for dynamic keys in firebase?

+1

Вы включили изображение дерева JSON в свой вопрос. Пожалуйста, замените это на фактический JSON как текст, который вы легко можете получить, нажав кнопку «Экспорт» в консоли базы данных Firebase. Наличие JSON в качестве текста делает его доступным для поиска, позволяет нам легко использовать его для тестирования с вашими фактическими данными и использовать его в нашем ответе, и в целом это просто хорошая вещь. –

+0

Сделано! @FrankvanPuffelen – justColbs

+0

Теперь я вижу, как вы его отредактировали. точно не знал, как это сделать. Спасибо! – justColbs

ответ

3

Это кажется довольно простой для добавления запрошенного индекса:

{ 
    "rules": { 
    "users": { 
     ".indexOn": ["kxSWLGDxpYgNQNFd3Q5WdoC9XFk2", "SjZLsTGckoc7ZsyGV3mmwc022J93", "mcOK5wVZoZYlFZZICXWYr3H81az2"] 
    } 
    } 
} 

Скорее всего, ваша проблема заключается в том, что добавлять эти индексы вручную невозможно, поскольку вы генерируете идентификаторы пользователей в своем коде.

К сожалению, API не генерирует индексы.

Вместо этого вам нужно будет моделировать свои данные по-другому, чтобы разрешить запрос, который вы хотите сделать. В этом случае вы хотите получить разговоры для конкретного пользователя. Таким образом, вы должны будете хранить разговоры для каждого конкретного пользователя:

conversationsByUser { 
    "SjZLsTGckoc7ZsyGV3mmwc022J93": { 
     "-KS3Y9dMLXfs3FE4nlm7": true 
    }, 
    "mcOK5wVZoZYlFZZICXWYr3H81az2": { 
     "-KS3Y9dMLXfs3FE4nlm7": true 
    } 
} 

Это может показаться на первый взгляд неэффективно хранить эти данные несколько раз, но очень часто при использовании баз данных NoSQL. И действительно ничем не отличается от того, будет ли база данных автоматически генерировать индексы для вас, за исключением того, что вам нужно написать код для обновления индексов самостоятельно.

+0

Я боялся этого, но проблем не было. Быстрое изменение клиента должно сделать трюк. Большое спасибо, сэр! Поистине оцените вашу помощь в сообществе Firebase. – justColbs

+0

Фрэнк Я не понимаю, как выглядят правила безопасности для вашего примера новой модели? Что будет включать этот индекс? – justColbs

+0

Вам не нужно определять индекс, так как вы можете просто получить список разговоров для пользователя, напрямую обратившись к нему: 'ref.child (" chatByUser "). Child (user.uid)' –