Firebase了解snapshot.child()

时间:2015-06-30 17:40:32

标签: javascript firebase firebase-security firebase-realtime-database

考虑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会拉动所有子对象,或者有没有办法检索父节点/对象而不拉动其中的某些子对象?那么这个方法对我来说是有意义的。

任何信息都将不胜感激!感谢

2 个答案:

答案 0 :(得分:7)

  

有没有一种方法可以检索父节点/对象而不会拉出一些子节点?

Firebase JavaScript API始终检索完整节点。所以:不,JavaScript API中没有办法获得浅薄的结果/

  

为什么会使用此快照方法child()

如果我们将snapshot.child("property")snapshot.val().property进行比较。 DataSnapshot.child()方法返回DataSnapshot,您可以从中再次获得refval()方法将快照的值反序列化为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