我正在尝试使用 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/