Java 对来自Firebase Firestore Android的数据执行添加/操作

Java 对来自Firebase Firestore Android的数据执行添加/操作,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在从Firestore检索数据,其中每个文档存储两个字段,一个是日期,另一个是秒。我希望对数据进行分组,以便将每个日期的秒数相加 例如,我有3个文档和2个日期相同但秒数不同的文档: date: 21-04-2019, timeTrained: 86 第二份文件: date: 21-04-2019, timeTrained: 24 date: 20-04-2019, timeTrained: 120 第三份文件: date: 21-04-2019, timeTrained: 24

我正在从Firestore检索数据,其中每个文档存储两个字段,一个是日期,另一个是秒。我希望对数据进行分组,以便将每个日期的秒数相加

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

date: 21-04-2019, 
timeTrained: 86
第二份文件:

date: 21-04-2019, 
timeTrained: 24
date: 20-04-2019, 
timeTrained: 120
第三份文件:

date: 21-04-2019, 
timeTrained: 24
date: 20-04-2019, 
timeTrained: 120
因此,我想在第一个和第二个文档中添加
timeTrained
,因为它们具有相同的日期,我的Firestore集合中会有许多类似的文档,因此我需要动态而不是硬编码

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


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

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));
        }
    }
});

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

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));
        }
    }
});

为了更好地理解,您需要计算所有
timeTrained
属性的值,其中
date
是例如
21-04-2019
,对吗?是,因为稍后将更新此属性以更好地理解,您想计算所有
时间训练
属性的值,其中
日期
为例如
21-04-2019
,对吗?是,因为稍后会更新此属性。谢谢,我会尝试。所以,如果我想更新timeTrained值,我会传递count变量,对吗?不,如果你想更新
timeTrained
值,你需要知道该属性的确切路径。Firebase没有SQL更新查询的概念。因此,在您的情况下,您需要首先读取要更新的节点,然后在其上循环,然后逐个或使用一个大型多位置更新语句进行更新。谢谢,我将尝试这样做。所以,如果我想更新timeTrained值,我会传递count变量,对吗?不,如果你想更新
timeTrained
值,你需要知道该属性的确切路径。Firebase没有SQL更新查询的概念。因此,在您的情况下,您需要首先读取要更新的节点,然后在其上循环,然后逐个或使用一个大的多位置更新语句更新它们。