【问题标题】:Perform Addition/operation on data from Firebase Firestore Android对来自 Firebase Firestore Android 的数据执行添加/操作
【发布时间】:2019-04-21 00:08:23
【问题描述】:

我正在从 Firestore 中检索数据,其中每个文档存储 2 个字段,一个是日期,另一个是秒。我想对数据进行分组,以便为​​每个日期添加秒数。

例如,我有 3 个文档和 2 个日期相同但秒数不同的文档:

date: 21-04-2019, 
timeTrained: 86

第二份文件:

date: 21-04-2019, 
timeTrained: 24

第三份文件:

date: 20-04-2019, 
timeTrained: 120

所以我想在第一个和第二个文档中添加timeTrained,因为它们具有相同的日期,我的 Firestore 集合中会有很多这样的文档,所以我需要它是动态的而不是硬编码的。

下图提供了存储在 Firestore 中的数据的快照。

【问题讨论】:

  • 为了更好地理解,您想计算所有timeTrained 属性的值,其中date 是例如21-04-2019,对吧?
  • 是的,稍后会更新

标签: java android firebase google-cloud-firestore


【解决方案1】:

要解决这个问题,请使用以下代码行:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference userExercisesRef = rootRef.collection("userExercises");
Query query = userExercisesRef.whereEqualTo("date", "21-04-2019");
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            long count = 0;
            for (QueryDocumentSnapshot document : task.getResult()) {
                long timeTrained = document.getLong("timeTrained");
                count = count + timeTrained;
            }

            Log.d(TAG, String.valueOf(count));
        }
    }
});

根据您提供的数据,对于 21-04-2019,您的 logcat 中的结果将是:

110

【讨论】:

  • 谢谢,我会试试的。因此,如果我想更新 timeTrained 值,我只需将其传递给 count 变量,对吗?
  • 不,如果您想更新 timeTrained 值,您需要知道该属性的确切路径。 Firebase 没有 SQL 更新查询的概念。因此,在您的情况下,您需要先读取要更新的节点,然后遍历它们,然后一个一个地更新它们,或者使用一个大的多位置更新语句来更新它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2021-08-02
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多