1

рассмотрит эту структуру данных, на который ссылается на Firebase краткого руководства (here)Firebase понимания snapshot.child()

{"name": {"first": "Fred","last": "Flintstone"} 

документы говорят, что можно получить доступ к местоположению datasnapshot каждого дочернего объекта «имя» возвращается из запроса, используя:

var ref = new Firebase("https://docs-examples.firebaseio.com/samplechat/users/fred"); 
ref.once("value", function(snapshot) { 
    var nameSnapshot = snapshot.child("name"); 
    var name = nameSnapshot.val(); 

    name === { first: "Fred", last: "Flintstone"} 

    var firstNameSnapshot = snapshot.child("name/first"); 
    var firstName = firstNameSnapshot.val(); 
    firstName === "Fred" 

    var lastNameSnapshot = snapshot.child("name").child("last"); 
    var lastName = lastNameSnapshot.val(); 
    lastName === "Flintstone" 

    var ageSnapshot = snapshot.child("age"); 
    var age = ageSnapshot.val(); 
    age === null (because there is no "age" child in the data snapshot) 
}); 

Но что немного странно об этом, когда обрабатываются следующие строки.

var nameSnapshot = snapshot.child("name"); 
var name = nameSnapshot.val(); 

name.first и name.last также восстановлены. Итак, зачем использовать этот метод моментального снимка «child()»? Вернее, когда было бы полезно использовать этот метод, поскольку, когда вы вытаскиваете родительский объект, Firebase вытаскивает всех детей или есть способ получить родительский узел/объект, не вытаскивая некоторые из его детей? Тогда этот метод для меня имел бы смысл.

Любая информация была бы с благодарностью оценена! Спасибо

ответ

5

Есть ли способ получить родительский узел/объект, не вытаскивая некоторые из его детей?

API-интерфейс Firebase JavaScript API всегда извлекает полный узел. Итак: нет, в JavaScript API нет способа получить мелкий результат/

Почему использовать этот метод моментального снимка child()?

Если мы сравним snapshot.child("property") с snapshot.val().property. Метод DataSnapshot.child() возвращает DataSnapshot, из которого вы можете снова получить ref. Метод val() десериализует значение моментального снимка в JSON. Поэтому вам нужно будет создать свой собственный реф, если он вам понадобится. Но ценность каждого в значительной степени зависит от вашего прецедента, поэтому «почему» я не могу ответить за вас.

+1

Я рассматривал метод .child() исключительно с точки зрения доступа к значению узла, когда на самом деле, как вы указали, может потребоваться получить ссылку на дочерний узел. Имеет смысл. В моем случае у меня был объект «запросы», в котором в качестве дочернего объекта был объект «comments». Объект comments содержал несколько дочерних узлов внутри них, поэтому я пытался выяснить, могу ли я получить объект запросов, не возвращая объект дочерних комментариев, потому что я не хотел вытаскивать каждый комментарий, когда кто-то запрашивает запрос. –

1

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

Пример, приведенный в руководстве, является слегка одномерным. В общем, у вас не было бы узла с именем с одним человеком.

Лучшим примером может быть узел называют пользователей с данными, как такой

users 
    user_id_0 
    firstName: 
    lastName: 
    age: 
    user_id_1 
    firstName: 
    lastName: 
    age: 

При использовании с параметром Value, снимок узла пользователей содержит все дочерние узлы, и все данные внутри каждого child (в данном случае все пользователи и их данные), а блок, который обрабатывает его, вызывается один раз. Мы используем это, чтобы читать, например, всех пользователей в узле пользователя, а затем перебирать пользователей для некоторых конкретных данных. Мы также используем его для выполнения многопараметрических запросов, которые напрямую не поддерживаются firebase. Так, например, мы хотим, чтобы все пользователи получили имя Elmo, 20 лет.

Параметр Add указывает каждый ребенок по одному, вызывая один раз блок для дочернего элемента, который будет каждый пользователь в этом случае.Обычно мы используем это, чтобы обновлять обновленный UI tableView (ObjC), поэтому, когда к Firebase добавляются новые дочерние данные, все приложения, которые наблюдают, будут уведомлены, поэтому мы можем обновить нашу таблицу пользовательского интерфейса.

Вы не можете получить родительский объект, не загружая его. Тем не менее, вы можете напрямую обращаться к ребенку, если знаете родительский объект, если ищете конкретную часть данных. Таким образом, вы можете получить пользователей/user_id_0/age

+0

Так скажите, например, что каждый ребенок внутри пользователя содержит дочерний объект, называемый «комментарии», и этот объект может содержать более 200 комментариев (просто чисто гипотетический). Если вы хотите вытащить пользователя и первые 10 комментариев объекта, из того, что вы объяснили, это невозможно, так как же тогда решить эту проблему? Неэффективно сбрасывать все комментарии, так как это может быть дорогостоящим, и я могу захотеть «на лету» накладывать «ленивые» комментарии. Есть ли образец для приближения к этому сценарию? –

+0

Отличный вопрос! Все сводится к тому, как структурированы данные. Запросы Firebase идут на 1 уровень глубины, поэтому в моем примере выше я мог запросить одно свойство, такое как firstName = «Elmo» или age = «20». Мы могли бы даже запросить возраст от 20 и до 30. С правильной структурой данных вы можете запросить первые 10 комментариев, последние 10, сегодняшние комментарии и т. Д. На ваш вопрос: возможно, узел «Комментарии», который называется ... Комментарии. Тогда каждый ребенок является комментарием, а его дети представляют собой комментарий, user_id и comment_date_time. Затем он может быть запрошен для comment_date_time после 12 часов утра. – Jay

+0

Я вижу. Это имеет большой смысл. Если я понимаю, что вы говорите, вместо комментариев, вложенных в качестве дочернего объекта внутри каждого пользователя, возможно, есть узел комментариев верхнего уровня, где каждый комментарий содержит копию пользовательского ключа комментатора. Это, в некотором смысле и очень просто будет работать, и я задаюсь вопросом, почему это никогда не приходило мне в голову. Очень ценю понимание и объяснение. Мне очень нравится Firebase, он просто поправляется в том, как он это делает. Огромное спасибо. –

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