15

I want to make a collection of users, users will have multiple stores as documents, each document have fields like storeName, storeAddress and availableProducts. My question is that how to manage availableProducts array? I know Firestore can't handle arrays, I should use HashMap. My available products may have field like product name, product price etc. I am new in Firebase, how can I manage availableProduct array using java in Android Studio?

FireBase Firestore DataBase Image

3
  • Are you asking how do you gather that data and put it into an Array or should you use a Map instead? Or how do you use a Map for that snapshot? Commented Jul 6, 2018 at 3:43
  • should i use map or subcollection? Commented Jul 6, 2018 at 3:57
  • Personally, I would use a Map as it makes more sense and easier. Which way is better, is up for interpretation. You might want to create a class of availableProduct, but the Map works just as well. Commented Jul 6, 2018 at 4:01

3 Answers 3

28

Good news guys, with the latest improvement to arrays you can add, update and remove an array element.

Check out this blog post: Better Arrays in Cloud Firestore!

You can do it like this

//Map to add user to array
final Map<String, Object> addUserToArrayMap = new HashMap<>();
addUserToArrayMap.put("arrayOfUsers", FieldValue.arrayUnion(mAuth.getCurrentUser().getUid()));

//Map to remove user from array
final Map<String, Object> removeUserFromArrayMap = new HashMap<>();
removeUserFromArrayMap.put("arrayOfUsers", FieldValue.arrayRemove(mAuth.getCurrentUser().getUid()));

//use either maps to add or remove user
db.collection("REFERENCE").document("mDocumentId")
                .update(addUserToArrayMap);
Sign up to request clarification or add additional context in comments.

2 Comments

really appreciate it man. This is perfect for a post voting system where there are two options up or down. But how would you do the query to get the final number of voters for each state (up or down)? I'm currently adding one whenever the users presses a vote but that isn't perfect obviously
@speedox It seems what you want is data at real time. This is a link to firebase documentation to achieve that firebase.google.com/docs/firestore/query-data/…
9

Edit: September 12, 2018

Starting with August 28, 2018, now it's possible to update array members. More informations here.


How to Add/Update/Remove array elements in firebase firestore?

The short answer is that you cannot! As in the official documentation regarding arrays:

Although Cloud Firestore can store arrays, it does not support querying array members or updating single array elements.

So there is currently no way to add, update or remove a single array element in a Cloud Firestore database.

Seeing your database schema I can say that you don't have any arrays. The availableProducts is an object, beneath it there is a map named 0 which holds two String properties, spName and spPrice. If you want to update, let's say the price, please use the following code:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference ref = rootRef.collection("gdgsghs.cok").document("Shsheg");
Map<String, Object> availableProducts = new HashMap<>();
Map<String, Object> zeroMap = new HashMap<>();
Map<String, Object> product = new HashMap<>();
product.put("spPrice", 63.121);
zeroMap.put("0", product);
availableProducts.put("availableProducts", zeroMap);
ref.set(availableProducts, SetOptions.merge());

Your price will be updated from 67.368 to 63.121.

2 Comments

Thanks for answering, but how to retrieve the product price?
This is basically another question. In order to follow the rules of this comunity, please post another fresh question, so me and other users can help you.
2

This is how you can add a new item to an existing collection inside a document :

FirebaseFirestore.getInstance().collection("COLLECTION_NAME").document("DOCUMENT_ID").update("NAME_OF_COLLECTION_NODE",FieldValue.arrayUnion(NEW_VALUE_OF_ANY_TYPE))

check this link for more info: https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.