Papa Smerf
Papa Smerf

Reputation: 31

Cloud Firestore Update

I'd like update document in cloud firestore according to value in document. Something like this. I have few documents with random names and values and one document with values id = 1 , name = patryk . And now I'd to update document with name=patryk. And I don't know document name because I make them like this and they have a random name.

b.collection("Users")
    .add(postMapa)
    .addOnCompleteListener

How to do this? here I need have the name of the document but I don't have.

Upvotes: 0

Views: 578

Answers (4)

Shaifali Rajput
Shaifali Rajput

Reputation: 1279

Try this and make sure there will be only single document for name = patryk

  db.collection("Users").whereEqualTo("name", "patryk").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if (e == null) {
                    String documentId = queryDocumentSnapshots.getDocuments().get(0).getId();
                   // here you have id but make sure you have only one document for name=patryk
                }
            }
        });

Upvotes: 3

Alex Mamo
Alex Mamo

Reputation: 138814

Assuming that the id property is of type number and the name property is of type String, please use the following code in order to update all users with the id = 1 and name = patryk:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("Users").whereEqualTo("id", 1).whereEqualTo("name", "patryk");
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (DocumentSnapshot document : task.getResult()) {
                list.add(document.getId());
            }

            for (String id : list) {
                rootRef.collection("Users").document(id).update("name", "New Name").addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "Name Updated!");
                    }
                });
            }
        }
    }
});

If you are using a model class for your user, please see my answer from this post.

Upvotes: 1

Gowthaman M
Gowthaman M

Reputation: 8272

Simple way to get all document id under the collections:

firebase.collection("Users").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());
        }
    }
});

Upvotes: 0

Martin Zeitler
Martin Zeitler

Reputation: 76579

you can retrieve documents by their name (which does not really apply here):

DocumentReference docRef = db.collection("Users").document("patryk");

or you can query for values contained in a document (which might answer your question):

/* create a reference to the Users collection */
CollectionReference users = db.collection("Users");

/* create a query against the collection */
Query query = users.whereEqualTo("name", "patryk");

the rest is the same procedure, in both cases:

/* asynchronously retrieve the document */
ApiFuture<DocumentSnapshot> future = docRef.get();

/* future.get() blocks on response */
DocumentSnapshot document = future.get();

if (document.exists()) {
    System.out.println("Document data: " + document.getData());
} else {
    System.out.println("No such document!");
}

Upvotes: 0

Related Questions