考虑Firebase快速入门指南(here)
上引用的此数据结构{"name": {"first": "Fred","last": "Flintstone"}
文档说可以访问" name"的每个子对象的数据快照位置。使用以下命令从查询返回:
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会拉动所有子对象,或者有没有办法检索父节点/对象而不拉动其中的某些子对象?那么这个方法对我来说是有意义的。
任何信息都将不胜感激!感谢
答案 0 :(得分:7)
有没有一种方法可以检索父节点/对象而不会拉出一些子节点?
Firebase JavaScript API始终检索完整节点。所以:不,JavaScript API中没有办法获得浅薄的结果/
为什么会使用此快照方法
child()
?
如果我们将snapshot.child("property")
与snapshot.val().property
进行比较。 DataSnapshot.child()
方法返回DataSnapshot
,您可以从中再次获得ref
。 val()
方法将快照的值反序列化为JSON。因此,如果您需要,您必须构建自己的参考。但每个的价值在很大程度上取决于你的用例,所以“为什么”不是我能为你解答的。
答案 1 :(得分:1)
快照是呼叫时节点中所有内容的精确图片。但是,它包含的内容将根据您获取快照的方式而有所不同。
指南中提供的示例略微是一维的。一般情况下,如果只列出一个人,则不会有名为name的节点。
一个更好的例子是一个名为user的节点,其数据就是这样的
users
user_id_0
firstName:
lastName:
age:
user_id_1
firstName:
lastName:
age:
当与Value参数一起使用时,users节点的快照包含节点的所有子节点以及每个子节点中的所有数据(在本例中为所有用户及其数据),以及处理它的块被叫一次。我们使用它来读取用户节点中的所有用户,然后针对某些特定数据迭代用户。我们还使用它来执行多参数查询,firebase不直接支持这些查询。例如,我们希望让所有名为Elmo的用户年满20岁。
Add参数一次一个地读取每个子节点,为子节点调用一次块,在这种情况下将是每个用户。通常我们使用它来保持UI tableView的更新(ObjC),因此当新的子数据添加到Firebase时,所有正在观察的应用程序都会收到通知,因此我们可以更新我们的UI表。
如果不检索子项,则无法检索父对象。但是,如果您正在查找特定的数据,则可以直接访问子对象(如果您知道父对象)。所以你可以检索users / user_id_0 / age