假设我有如下所示的条目:
我想为预估列表中的每一项将priority
字段递增1。
我可以像这样获取估计值:
var estimates = firebase.child('Estimates');
在此之后,我如何自动将每个预估优先级递增1?
发布于 2015-12-26 06:15:09
这是循环所有项目并提高其优先级的一种方法:
var estimatesRef = firebase.child('Estimates');
estimatesRef.once('value', function(estimatesSnapshot) {
estimatesSnapshot.forEach(function(estimateSnapshot) {
estimateSnapshot.ref().update({
estimateSnapshot.val().priority + 1
});
});
});
它循环遍历Estimates
的所有子级,并增加每个子级的优先级。
您还可以将这些调用合并为单个update()
调用:
var estimatesRef = firebase.child('Estimates');
estimatesRef.once('value', function(estimatesSnapshot) {
var updates = {};
estimatesSnapshot.forEach(function(estimateSnapshot) {
updates[estimateSnapshot.key+'/priority'] = estimateSnapshot.val().priority + 1;
});
estimatesRef.update(updates);
});
性能将类似于第一个解决方案(Firebase在处理多个请求时非常高效)。但在第二种情况下,它将被发送一个命令到服务器,因此它要么失败,要么完全成功。
发布于 2019-04-06 18:36:12
仅适用于FIRESTORE API的,不适用于FIREBASE
多亏了最新的Firestore补丁(2019年3月13日),你不需要遵循上面的其他答案。
firestore的FieldValue类现在托管一个增量方法,该方法自动更新firestore数据库中的数字文档字段。可以将此FieldValue标记与DocumentReference
对象的set
( mergeOptions为true)或update
方法一起使用。
使用方法如下(来自官方docs,这就是全部):
DocumentReference washingtonRef = db.collection("cities").document("DC");
// Atomically increment the population of the city by 50.
washingtonRef.update("population", FieldValue.increment(50));
如果你想知道,它可以从firestore的18.2.0
版本中获得。为方便起见,Gradle依赖项配置为implementation 'com.google.firebase:firebase-firestore:18.2.0'
注意:增量操作对于实现计数器很有用,但请记住,每秒只能更新单个文档一次。如果您需要更新超过此速率的计数器,请参阅Distributed counters页面。
EDIT 1:FieldValue.increment()
纯粹是“服务器”端(发生在firestore中),因此您不需要向客户端公开当前值。
EDIT 2:在使用管理API时,您可以使用admin.firestore.FieldValue.increment(1)
实现相同的功能。感谢@Jabir Ishaq自愿让我了解这个未记录的功能。:)
EDIT 3:如果要增减的目标字段不是数字或不存在,increment
方法将取值为当前值!这在您第一次创建文档时很有帮助。
https://stackoverflow.com/questions/34458930
复制相似问题