2016-04-13 3 views
0

Я довольно новый для Firebase и имеют рейтинг приложения, где моя структура в настоящее время выглядит следующим образом:Firebase: Поиск дочерних узлов, которые имеют уникальный идентификатор

{ 
    "Rankings" : { 
    "-KFGX5H3rLSnpPvupakm" : { 
     "Sports Teams" : { 
     "Red sox" : 1, 
     "Warriors" : 3, 
     "Yankees" : 2 
     } 
    }, 
    "-KFGZkwAIl817CLDLmMp" : { 
     "Beers" : { 
     "Bud light" : 3, 
     "Coors" : 2, 
     "Pbr" : 4 
     } 
    } 
    } 
} 

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

Например, если пользователь ищет ранжирование с использованием термина «Спорт», как я могу пройти дерево Rankings, ища все рейтинги, содержащие «Спорт»?

+0

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

+0

Извинения @FrankvanPuffelen, см. Отредактированный – chicobermuda

ответ

0

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

{ 
    "Rankings" : { 
    "-KFGX5H3rLSnpPvupakm" : { 
     "Sports Teams" : { 
     "Red sox" : 1, 
     "Warriors" : 3, 
     "Yankees" : 2 
     } 
    }, 
    "-KFGZkwAIl817CLDLmMp" : { 
     "Beers" : { 
     "Bud light" : 3, 
     "Coors" : 2, 
     "Pbr" : 4 
     } 
    } 
    }, 
    "SearchTerms": { 
     "Red sox" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Warriors" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Yankees" : { 
      "-KFGX5H3rLSnpPvupakm": true 
     }, 
     "Bud light" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     }, 
     "Coors" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     }, 
     "Pbr" : { 
      "-KFGZkwAIl817CLDLmMp": true 
     } 
    } 
} 

Этот процесс называется денормализации данных, и это описано в this blog post, в Firebase documentation on structuring data и в этом . И, вероятно, полдюжины подобных ответов, которые я дал недавно.

+0

В «SearchTerms» было бы разумнее использовать индекс, который сопоставляется с ключом для поиска, который я могу запросить, как вы, или сохранить все те же данные в разделе «SearchTerms», как хранится в разделе «Поиск», Рейтинги ", без' autoId', поэтому я могу потратить только 1 запрос? – chicobermuda

+0

Оба имеют свои достоинства. Но не переоценивайте накладные расходы этих поисков. См. [Этот ответ] (http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786# 35932786) о том, почему циклы поиска Firebase могут быть быстрее, чем вы ожидаете. –

0

Мне удалось получить значения child node-id's.

Вот мой пример кода:

LOCATION_URL.queryOrderedByChild("email").queryEqualToValue(FIRAuth.auth()?.currentUser?.email).observeEventType(.Value, withBlock: { snapShot in 

     let enumerator = snapShot.children 

     while let rest = enumerator.nextObject() { 

      var shot = rest.childSnapshotForPath(rest.key) 
      // child node ID 
      print(shot.key) 

     } 
    }) 

Я надеюсь, что это поможет вам .. С наилучшими пожеланиями, Назар Medeiros

Смежные вопросы