在Firebase中增加所有值的最有效方法

Jor*_*ash 6 angularjs firebase firebase-realtime-database

说我有看起来像这样的条目:

Firebase图片

我想将priority“估计”列表中每个项目的字段增加1。

我可以这样估算:

var estimates = firebase.child('Estimates');
Run Code Online (Sandbox Code Playgroud)

之后,我如何将每个“估计”优先级自动递增1?

var*_*run 7

仅用于FIRESTORE API,不用于FIREBASE

感谢最新的Firestore补丁程序(2019年3月13日),您无需遵循上面的其他答案。

Firestore的FieldValue类现在托管一个增量方法,该方法自动更新Firestore 数据库中的数字文档字段。您可以将此FieldValue标记与set(带有mergeOptions true)或对象的update方法一起使用DocumentReference

用法如下(从官方文档开始,这就是全部):

DocumentReference washingtonRef = db.collection("cities").document("DC");

// Atomically increment the population of the city by 50.
washingtonRef.update("population", FieldValue.increment(50));
Run Code Online (Sandbox Code Playgroud)

如果您想知道,可从18.2.0Firestore 版本获得。为了您的方便,Gradle依赖项配置为implementation 'com.google.firebase:firebase-firestore:18.2.0'

注意:增量操作对于实现计数器很有用,但是请记住,您每秒只能更新一次文档。如果您需要以高于此速率的价格更新计数器,请参见“ 分布式计数器”页面。


编辑1FieldValue.increment()纯粹是“服务器”端(发生在Firestore中),因此您无需将当前值公开给客户端。

编辑2:在使用管理API时,您可以使用admin.firestore.FieldValue.increment(1)相同的功能。感谢@Jabir Ishaq自愿让我知道未记录的功能。:)

编辑3:如果要增加/减少的目标字段不是数字或不存在,则该increment方法将值设置为当前值!首次创建文档时,这很有用。


Fra*_*len 6

这是循环所有项目并提高其优先级的一种方法:

var estimatesRef = firebase.child('Estimates');
estimatesRef.once('value', function(estimatesSnapshot) {
  estimatesSnapshot.forEach(function(estimateSnapshot) {
    estimateSnapshot.ref().update({
      estimateSnapshot.val().priority + 1
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

它遍历所有子项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);
});
Run Code Online (Sandbox Code Playgroud)

性能将类似于第一个解决方案(Firebase 在处理多个请求时非常高效)。但是在第二种情况下,它将向服务器发送一个命令,因此它要么失败要么完全成功。