Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase理解快照.child()_Javascript_Firebase_Firebase Security_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase理解快照.child()

Javascript Firebase理解快照.child(),javascript,firebase,firebase-security,firebase-realtime-database,Javascript,Firebase,Firebase Security,Firebase Realtime Database,考虑Firebase快速入门指南()中引用的此数据结构 文档表示,可以通过以下方式访问查询返回的每个“name”子对象的datasnapshot位置: var ref = new Firebase("https://docs-examples.firebaseio.com/samplechat/users/fred"); ref.once("value", function(snapshot) { var nameSnapshot = snapshot.child("name");

考虑Firebase快速入门指南()中引用的此数据结构

文档表示,可以通过以下方式访问查询返回的每个“name”子对象的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.firstname.last也会被检索。那么,为什么要使用这个快照方法“child()”?或者更确切地说,什么时候使用这种方法会有好处,因为当您拉动父对象时,Firebase会拉动所有子对象,或者有没有一种方法可以检索父节点/对象而不拉动它的一些子对象?那么这个方法对我来说是有意义的

如有任何信息,将不胜感激!谢谢

有没有一种方法可以检索父节点/对象而不必拉取它的一些子节点/对象

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

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


如果我们将
snapshot.child(“属性”)
snapshot.val().property
进行比较。
DataSnapshot.child()
方法返回一个
DataSnapshot
,您可以从中再次获得一个
ref
val()
方法将快照的值反序列化为JSON。因此,如果需要,您必须构建自己的ref。但是每一个的值在很大程度上取决于您的用例,因此“为什么”不是我可以回答的问题。

快照是调用时节点中所有内容的精确图片。但是,它包含的内容将根据您获取快照的方式而有所不同

指南中提供的示例稍微是一维的。通常,您不会有一个名为name的节点,其中只列出了一个人

一个更好的例子是一个名为users的节点,其数据就是这样的

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\u id\u 0/age

我只是从访问节点值的角度来看方法.child(),而实际上,正如您所指出的,可能需要检索对子节点的引用。有道理。在我的例子中,我有一个对象“requests”,作为子对象,它有一个“comments”对象。comments对象中包含多个子节点,因此我尝试查看是否可以检索requests对象,而不检索child comments对象,因为我不想在有人查询请求时提取每个注释。例如,用户中的每个子节点都包含一个名为“comments”的子对象,这个对象可以包含200条以上的注释(纯粹是假设的)。如果你想从你解释的内容中提取用户和对象的前10条注释,这是不可能的,那么如何解决这个问题呢?把每个评论都拉下来是没有效率的,因为这可能会很昂贵,而且我可能希望动态地对评论进行分页/延迟加载。有没有一个模式来处理这个场景?好问题!这一切都归结于数据的结构。Firebase查询的深度为1级,因此在上面的示例中,我可以查询单个属性,如firstName=“Elmo”或age=“20”。我们甚至可以查询从20岁开始到30岁结束的年龄。使用正确的数据结构,您可以查询前10条评论、最后10条评论、今天的评论等。您的问题:可能是一个名为。。。评论。然后每个子元素都是一个注释id,它的子元素是注释、用户id和注释日期时间。然后在今天早上12点之后可以查询评论日期时间。我明白了。这很有道理。如果我理解您的意思,而不是将注释作为子对象嵌套在每个用户中,那么可能有一个顶级注释节点,其中每个注释子节点包含注释者的用户密钥的副本。从某种程度上说,这很简单,我想知道为什么我从来没有想过,哈哈。真的很感谢你的洞察力和解释。我真的很喜欢Firebase,它正在重新调整它的工作方式。非常感谢你。
users
  user_id_0
   firstName:
   lastName:
   age:
  user_id_1
   firstName:
   lastName:
   age: