增加Firebase Firestore中的现有价值

时间:2019-03-18 13:23:02

标签: java android firebase google-cloud-firestore

有什么方法可以增加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中现有值的任何功能吗?


1 个答案:

答案 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中),因此您无需将当前值公开给客户端。