了解 Firebase snapshot.child()

Firebase understanding snapshot.child()

考虑 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.firstname.last 也被检索。那么为什么要使用这种快照方法"child()"呢?或者更确切地说,什么时候使用此方法会有好处,因为当您拉取父对象时,Firebase 会拉取所有子对象,或者有没有一种方法可以检索父对象 node/object 而无需拉取其中的一些子对象?那么这个方法对我来说就有意义了。

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

is there a way to retrieve a parent node/object without pulling some of it's children?

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

why would one use this snapshot method child()?

如果我们比较 snapshot.child("property")snapshot.val().propertyDataSnapshot.child()方法returns一个DataSnapshot,从中你可以再次得到一个refval() 方法将快照的值反序列化为 JSON。因此,如果您需要,则必须构建自己的 ref。但是每个值在很大程度上取决于您的用例,因此 "why" 我无法为您解答。

快照是调用时节点中所有内容的精确图片。但是,它包含的内容会因您获取快照的方式而异。

指南中提供的示例略one-dimensional。一般来说,您不会有一个名为 name 的节点,其中只列出了一个人。

一个更好的例子是一个名为 users 的节点,它具有这样的数据

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

当与 Value 参数一起使用时,用户节点的快照包含节点的所有 children 和每个 child 中的所有数据(在这种情况下,所有用户和他们的数据),并且处理它的块被调用一次。例如,我们使用它来读取用户节点中的所有用户,然后遍历用户以获取某些特定数据。我们还用它来做 multi-parameter 查询,firebase 不直接支持这些查询。因此,例如,我们想要获取所有名为 Elmo、年龄 20 的用户。

Add 参数读取每个 child,一次读取一个,为 child 调用一次块,在本例中为每个用户。通常我们使用它来保持 UI tableView 的更新(ObjC),所以当新的 child 数据被添加到 Firebase 时,所有正在观察的应用程序都会收到通知,因此我们可以然后更新我们的 UI table.

如果不同时检索 children,则无法检索 parent object。但是,如果您要查找特定数据,则可以直接访问 child 如果您知道 parent object。所以你可以检索 users/user_id_0/age