2017-02-11 3 views
2

У меня есть firebase структура базы данных, подобной этойПоиск по firebase ребенка ценности ребенка

enter image description here

Можно ли запрос по адресу электронной почты, говорят «[email protected]» и получить оба ключи «1248769d7j8», а также его родительский «deaf7834jd8d7j-78»?

Решение, которое у меня есть, - сделать структуру базы данных более плоской. Но мне интересно, если можно обойтись без денормализации

Update: В моем случае, как 124 ... и DEA ... неизвестные, уникальные идентификаторы

+1

Нет, это невозможно. Вы можете указать глубинные пути при упорядочивании по дате (например, 'some/deep/property') и при определении индексов, но компоненты указанных путей должны быть известными именами (так сказать), а' 1248769d7j8' представляется идентификатором, который не будет известно, когда вы будете определять правила безопасности (для индексов) и т. д. – cartant

+0

Спасибо, я так и думал. Будет создана другая ветка базы данных. – sera

+0

@cartant. Пожалуйста, см. Ответ, поскольку это очень легко сделать. – Jay

ответ

3

Edit: Ответ был изначально Да, однако с обновленной информацией от OP, как родительский узел «глухой ...», так и дочерний узел «1248 ...» оба являются неизвестными, поэтому не было бы способа обработать глубокий запрос.

Если дочерний узел «1248» был согласован как ключ для каждого дочернего узла глухого узла, тогда ответ «да».

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

данной структуре

root 
    posts 
    post_1 
     details 
     posted_by: "Leroy" 
    post_2 
     details 
     posted_by: "Bill" 

Давайте сделать запрос для узла Leroy с помощью глубокого запроса:

let postsRef = ref.child("posts") 

let queryRef = dataRef.queryOrdered(byChild: "details/posted_by") 
         .queryEqual(toValue: "Leroy") 
queryRef.observeSingleEvent(of: .value, with: { (snapshot) in 
    let a = snapshot.key //the posts node 
    print(a) 

    for child in snapshot.children { 
     let childSnap = child as! FIRDataSnapshot   
     print(childSnap.key) //the direct parent node 
    } 
}) 

и результат будет печатать

posts 
post_1 

Другой вариант включают родительский узел в узле нижнего уровня, например,

root 
    deaf91298823 
    1248 
    email: "[email protected]" 
    name: "Adam" 
    parent_node: "1248" 
    parent_parent: "deaf91298823" 
+0

Для тех, кто в подобном затруднительном положении, это отличный ответ. Однако, в моем случае, я не могу делать 'let postsRef = ref.child (" posts ")', поскольку сообщения - это неизвестный уникальный идентификатор. Обновлен мой вопрос, чтобы уточнить. – sera

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