2016-06-14 2 views
2

Если у меня есть следующая структура в Firebase:Firebase сложные пункты запроса

{ 
    "images": { 
    "first_image": { 
     "url": "https://ima.ge/first_image", 
     "uploader": "john", 
     "timestamp": "1465920841" 
    }, 
    "second_image": { 
     "url": "https://ima.ge/second_image", 
     "uploader": "louis", 
     "timestamp": "1465920987" 
    }, 
    "third_image": { 
     "url": "https://ima.ge/third_image", 
     "uploader": "peter", 
     "timestamp": "1465920990" 
    } 
    }, 

    "votes": { 
    "first_image": { 
     "john": "up", 
     "louis": "down" 
     "francis": "up" 
    }, 
    "second_image": { 
     "john": "up", 
     "louis": "down" 
    }, 
    "third_image": { 
     "francis": "up" 
    } 
    } 
} 

Можно ли запросить, например, все изображения, которые john не голосовали за уже с Firebase?

Я прочитал документацию, и, насколько я понимаю, такие запросы не возможны вообще. Так что, если это невозможно, как я могу попытаться переструктурировать мои данные, чтобы иметь возможность делать такие запросы в моем примере?

Я использую «новую» консоль Firebase и в настоящее время версию SDK Firebase для iOS и Android, но мне не нужен конкретный пример, вместо этого я хочу понять, как можно создавать сложные запросы в Firebase, либо путем реструктуризации моих данных, либо, если я неправильно понял документацию, с помощью обычных запросов.

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

ответ

4

Да, Вы можете это сделать.

Вот пример, чтобы найти узлы, которые НЕ имеют права голоса, которые возвратят узел third_image из структуры в вопросе.

let ref = self.myRootRef.childByAppendingPath("votes") 
ref.queryOrderedByChild("john").queryEqualToValue(nil) 
     .observeEventType(.Value, withBlock: { snapshot in 
     for child in snapshot.children { 
      print(child) 
     } 
}) 

Помните .Value возвращает несколько узлов, поэтому мы должны перебрать затем для ребенка ... чтобы добраться до каждого из них.

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

+0

Спасибо, на самом деле я использую UID для пользователей, а также для изображений. Это был просто простой пример, чтобы не путать никого с uids. – Ybrin

+0

Звучит так, как вам хорошо! – Jay

+0

Другой вопрос, который может быть связан: если у меня есть значение «начало» и «конец», которые являются в основном временными метками, как можно получить только те дети, которые «работают»? Итак, где текущая временная метка находится в пределах этих двух временных меток. Возможно ли это, потому что я думал, что несколько запросов невозможно. Могу ли я его структурировать так, чтобы это было возможно? – Ybrin

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