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是的,它不存在,但我尝试了,令人惊讶的是,它为我工作!塔克斯