Обновление строкового поля во всех документах, найденных в коллекции в Firestore - PullRequest
0 голосов
/ 30 августа 2018

В основном я хотел бы знать, возможно ли обновить все документы, найденные в коллекции в Firestore. Я могу получить все документы в списке примерно так:

mFirebaseFirestore.collection("Events").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getId());
            }
            Log.d(TAG, list.toString());
            } else {
                Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

Но я не могу обновить все документы или похожие строки в этих документах одновременно. Если вышеупомянутое невозможно, что может быть обходным путем, чтобы обновить все документы.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Чтобы обновить все документы в коллекции, сначала вам нужно получить все из них в списке, а затем выполнить итерацию этого списка и обновить их. Вот пример кода: -

for (int k = 0; k < list.size(); k++) {
    firestore.collection("Events").document(list.get(k))
        .update("Key", value).addOnSuccessListener(new OnSuccessListener<Void>()
            {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.i("Update", "Value Updated");

                }
             })
             .addOnFailureListener(new OnFailureListener() {
                 @Override
                 public void onFailure(Exception e) {
                     Toast.makeText(MainActivity.this, "Error In Updating Details: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                 }
    });
}
0 голосов
/ 30 августа 2018

Метод Радж будет работать, но может привести к выполнению большого количества записей. Как упоминал Дуг, вы можете сделать это в пакетном режиме.

void getData() {

    mFirebaseFirestore.collection("Events").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                List<String> list = new ArrayList<>();
                for (QueryDocumentSnapshot document : task.getResult()) {
                    list.add(document.getId());
                }
                Log.d(TAG, list.toString());
                updateData(list); // *** new ***
            } else {
                Log.d(TAG, "Error getting documents: ", task.getException());
            }
        }
    });

}

void updateData(ArrayList list) {

    // Get a new write batch
    WriteBatch batch = db.batch();

    // Iterate through the list
    for (int k = 0; k < list.size(); k++) {

        // Update each list item
        DocumentReference ref = db.collection("Events").document(list.get(k));
        batch.update(ref, "field_you_want_to_update", "new_value");

    }

    // Commit the batch
    batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            // Yay its all done in one go!
        }
    });

}

Документация: https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes

0 голосов
/ 30 августа 2018

Не существует одной операции, которая обновит несколько документов на основе критериев поиска сома. Вам нужно будет повторить результаты запроса, как вы это делаете сейчас, а затем индивидуально обновить каждый из документов. Возможно, вы также можете использовать транзакцию или пакетную запись для атомарного выполнения обновлений, но это не позволит вам предотвратить повторение всех документов в исходном результате запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...