Angularjs 提高Firebase中所有内容价值的最有效方法

Angularjs 提高Firebase中所有内容价值的最有效方法,angularjs,firebase,firebase-realtime-database,Angularjs,Firebase,Firebase Realtime Database,假设我有这样的条目: var estimates = firebase.child('Estimates'); 我想为估计列表中的每个项目将优先级字段增加1 我可以像这样获取估算: var estimates = firebase.child('Estimates'); 在此之后,我如何将每个评估优先级自动增加1?这是一种循环所有项目并增加其优先级的方法: var estimatesRef = firebase.child('Estimates'); estimatesRef.once('

假设我有这样的条目:

var estimates = firebase.child('Estimates');

我想为估计列表中的每个项目将
优先级
字段增加1

我可以像这样获取估算:

var estimates = firebase.child('Estimates');

在此之后,我如何将每个评估优先级自动增加1?

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

var estimatesRef = firebase.child('Estimates');
estimatesRef.once('value', function(estimatesSnapshot) {
  estimatesSnapshot.forEach(function(estimateSnapshot) {
    estimateSnapshot.ref().update({
      estimateSnapshot.val().priority + 1
    });
  });
});
它在
估计值的所有子项上循环,并增加每个子项的优先级

您还可以将这些调用组合成一个
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在处理多个请求时非常有效)。但在第二种情况下,它将向服务器发送一条命令,因此它要么失败,要么完全成功。

仅适用于FIRESTORE API,而不适用于FIREBASE

得益于最新的Firestore补丁(2019年3月13日),您无需遵循上述其他答案。

Firestore的FieldValue类现在承载一个增量方法,该方法以原子方式更新Firestore数据库中的数字文档字段。您可以将此FieldValue sentinel与
设置
(合并选项为true)或
更新
对象的方法一起使用

用法如下(官方提供,仅此而已):

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

注意:增量操作对于实现计数器很有用,但是 请记住,一次只能更新一个文档一次 第二如果您需要更新高于此速率的计数器,请参阅 页面


编辑1
FieldValue.increment()
纯粹是“服务器”端(发生在firestore中),因此您不需要向客户端公开当前值

编辑2:在使用管理API时,您可以使用
admin.firestore.FieldValue.increment(1)
实现相同的功能。感谢@Jabir Ishaq主动让我了解未记录的功能。:)


编辑3:如果要递增/递减的目标字段不是数字或不存在,
递增方法将该值设置为当前值!这在您第一次创建文档时非常有用。

您尝试过什么吗?firebase文档不错,可以帮助您入门。这本指南只需几个小时,而且可以为您节省大量时间:回答如下。下一个问题:展示你已经尝试过的内容,不要包含文本截图。您可以从Firebase dashboard导出JSON,并将其作为文本包含,这使我们更容易在答案中重复使用(以及在计算答案时使用)。您能为您的纯代码答案添加一些解释吗?但是,由于它确实试图回答这个问题(从外观上看),它可能不应该在那里。这对firebase 3有用吗?它似乎不喜欢estimateSnapshot.val().priority+1语句……我很确定该语句没有任何更改。如果您有问题,请向发布一个问题,我们可以查看。问题在于
estimateSnapshot.key()
。因为firebase 3,它不是一个方法,而是一个值。所以只要去掉括号:
estimateSnapshot.key
我可以用python中的admin_sdk来完成吗?哦,嗨。我在AdminSDK中没有看到任何这样的方法。我想您应该使用
DocumentReference.update()
(),因为您已经在受信任的环境中运行代码了。。。目前,AdminSDK中没有
increment
方法。。。(据我搜索!)对于AdminSDK,代码
admin.firestore.FieldValue.increment(1)
有一点变化,以供参考()@JabirIshaq嘿,谢谢你的回复。我在上查看了页面,但找不到
increment
方法文档!是否在web文档中存在但尚未更新P@varun是的,它不存在,但我尝试了,令人惊讶的是,它为我工作!塔克斯