javascript - Firebase update() 不是带有查询的函数

标签 javascript angularjs firebase firebase-realtime-database

我正在尝试使用 AngularJS 更新 Firebase 数据库记录中的属性。我可以设置一个查询来查找我的记录:

  firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value')
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      console.log(childSnapshot.val())
    });
  })

如果我在记录的 key 中进行硬编码,我可以更新我的属性:

firebase.database().ref('en/-KloeQHDC-mugPjJMAG4').update({ wordFrequency: 111 })

但是如果我设置一个查询来查找记录然后更新它,我会收到一条错误消息update is not a function:

firebase.database().ref('en/').orderByChild('word').equalTo('the').update({ wordFrequency: 9001 })

另一个answer建议从 forEach 循环中调用 update():

  firebase.database().ref('en/').orderByChild('word').equalTo('the').once('value')
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      console.log(childSnapshot.val()); // this works
      childSnapshot.ref().update({ wordFrequency: 9001 });
    });
  });

返回错误消息 TypeError: childSnapshot.ref is not a function。我不明白 childSnapshot 是一个 Firebase 引用。

另一个answer

When you call update() on a location, Firebase loops over the data that you pass in (in your case asJson) and for each key performs a ref.child(key).set(value).

如果 update() 循环数据,我为什么要从 forEach 循环中调用 update()documentation不显示从 forEach 循环内部调用 update()

最佳答案

Firebase 数据库 SDK 提供了一个 Reference.update() 方法来更新数据库中单个位置的数据。这里的关键是 Reference 是数据库中的一个位置,因此很清楚要更新什么。

我关于多路径更新如何工作的伪代码解释适用于数据库服务器如何实现它:给定一个位置/DatabaseReference 它更新 update()< 中的每个路径 调用基于那个。

Query 可以匹配数据库中的多个位置,因此它没有 update() 方法(或 set()remove() 就此而言)。

要更新与查询匹配的每个位置,您执行查询,然后对每个结果调用 update() - 通过 child_added 监听器,或使用 value 监听器和一个类似于上一个代码段的循环。

关于javascript - Firebase update() 不是带有查询的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45047661/

相关文章:

angularjs - 如何将自定义方法添加到 restangular 服务?

javascript - 如何获取指令中的属性参数

javascript - Angular JS - 使用过滤器检查单个值

javascript - React Native Firebase 身份验证错误处理

javascript - 为什么我在 View 中看不到这个变量?

Javascript - 以编程方式对形状进行动画处理,其方式与 After Effects 中摆动路径的工作方式相同

javascript - Socket.io:如何让每个人获得不同的 channel ?

javascript - dojo xhr帖子问题

angular - 查询根据结果集的大小而不是数据集的大小进行缩放

java - firebase 数据库查询并返回值 true,但如果用户存在则仍继续前进,并注册重复条目