有什么方法可以增加firestore中的现有值?
(setq haskell-process-type 'stack-ghci)
((org-babel-do-load-languages
'org-babel-load-languages
'((haskell . t)))
What i am trying
数据库结构
FirebaseFirestore.getInstance()
.collection("notifications")
.document(response.getString("multicast_id"))
.set(notificationData);
FirebaseFirestore.getInstance()
.collection("users")
.document(post.userId)
.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
int followers = Integer.valueOf(task.getResult().getData().get("followers").toString());
FirebaseFirestore.getInstance()
.collection("users")
.document(post.userId).update("followers", followers++).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
});
}
}
});
根据此Answer 该功能可用于递增或递减数字字段值
版本5.9.0-2019年3月14日
添加了FieldValue.increment(),可在update()和 设置(...,{merge:true})以增加或减少数字字段值 安全地进行交易。
https://firebase.google.com/support/release-notes/js
所以我的问题是可用于增加Firestore android中现有值的任何功能吗?
答案 0 :(得分:1)
没有FieldValue.increment()
可用,但我们可以实现Updating data with transactions
Updating data with transactions
使用Cloud Firestore客户端库,您可以将多个操作分组为一个事务。当您要基于某个字段的当前值或某个其他字段的值更新该值时,事务很有用。您可以通过创建一个事务来增加计数器的数量,该事务读取该计数器的当前值,然后对其进行递增,然后将新值写入Cloud Firestore。
事务由任意数量的get()操作和随后任意数量的写操作(例如set()
,update()
或delete()
)组成。如果是并发编辑,Cloud Firestore将再次运行整个事务。例如,如果某个事务读取文档,而另一个客户端修改了这些文档中的任何一个,则Cloud Firestore 重试该事务。此功能可确保交易在最新且一致的数据上运行。
交易永远不会部分应用写入。所有写入都在成功事务结束时执行。
使用交易记录时,请注意:
Passing information out of transactions
请勿在事务功能内部修改应用程序状态。这样做会引入并发问题,因为事务功能可以运行多次,并且不能保证在UI线程上运行。而是从事务功能中传递所需的信息。下面的示例在前面的示例的基础上构建,以显示如何从事务中传递信息:
Example
final DocumentReference sfDocRef = db.collection("cities").document("SF");
db.runTransaction(new Transaction.Function<Double>() {
@Override
public Double apply(Transaction transaction) throws FirebaseFirestoreException {
DocumentSnapshot snapshot = transaction.get(sfDocRef);
double newPopulation = snapshot.getDouble("population") + 1;
if (newPopulation <= 1000000) {
transaction.update(sfDocRef, "population", newPopulation);
return newPopulation;
} else {
throw new FirebaseFirestoreException("Population too high",
FirebaseFirestoreException.Code.ABORTED);
}
}
}).addOnSuccessListener(new OnSuccessListener<Double>() {
@Override
public void onSuccess(Double result) {
Log.d(TAG, "Transaction success: " + result);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Transaction failure.", e);
}
});
编辑2
感谢最新的Firestore补丁(2019年3月13日)
Firestore的FieldValue类现在托管一个 increment 方法,该方法可以自动更新Firestore数据库中的数字文档字段。您可以将此FieldValue标记与set
对象的update
(具有mergeOptions true)或DocumentReference
方法一起使用。
用法如下(从官方文档开始,这就是全部):
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页。
FieldValue.increment()
纯粹是“服务器”端(发生在Firestore中),因此您无需将当前值公开给客户端。