Remon Shehatta
Remon Shehatta

Reputation: 1470

add/overwrite field of type array in Firestore

I want to add a field of type array inside a collection.

if the field doesn't exist create it. if it exists overwrite it with the new array value.

the field should be called macAddress and it's of type array of String

enter image description here

I have tried the following:

val macInput = setting_mac_text.text.toString()
            val macArray = macInput.split(",")
            val macList = Arrays.asList(macArray)
            val data =
                hashMapOf(Pair(FirebaseConstants.USER_MAC_ADDRESS, macArray))
            //save it in firebase
            db.collection(FirebaseConstants.ORGANIZATION)
                .document(orgID + ".${FirebaseConstants.USER_MAC_ADDRESS}")
                .set(FieldValue.arrayUnion(macList))
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        Log.d(TAG, "successfully inserted")
                    } else {
                        Log.d(TAG, " failed ${task.exception}")
                    }
                }

also tried to insert the list itself and hash map like this

val data = hashMapOf(Pair(FirebaseConstants.USER_MAC_ADDRESS, macArray))
db.collection(FirebaseConstants.ORGANIZATION)
                .document(orgID)
                .set(data))

but it keeps giving me java.lang.IllegalArgumentException: Invalid data. Nested arrays are not supported

what am I doing wrong here?

Upvotes: 0

Views: 369

Answers (2)

Ajay Gupta
Ajay Gupta

Reputation: 2033

To overwrite an array, you would simply call the set method and have the merge option set to true:

try {
  const query = await DatabaseService.queryBuilder({
    collection: CollectionName,
  });

  return await query
    .doc(insuranceId)
    .set(
      { DOCUMENT_PROPERTY_HERE: ARRAY_HERE },
      { merge: true }
    );
} catch (exception) {
  return Promise.reject(exception);
}

Upvotes: 0

Doug Stevenson
Doug Stevenson

Reputation: 317362

You're doing three things wrong here:

  1. FieldValue.arrayUnion() is only meant to be used as the value of a field to add elements to that field. The way you are using it now in the first sample, it's being taken as the entire contents of the document.
  2. set() with one parameter is only intended to create or overwrite an entire document. It can't be used to update an existing document. You would have to pass in SetOptions to tell it to merge if you want an update. Or, you would simply use update() to modify an existing document.
  3. Your code that deals with macArray and macList isn't working the way you expect. You are creating a list with one element, which is itself an array. The error message is telling you that you can't have nested arrays like this.

I suggest taking a step back and simplifying your code, removing all the moving parts that don't have to do with Firestore. Just hard code values in your Firestore update until the update works the way you want, then add in the code that works with actual values. Get one simple thing to work, then add to it. If you get an error, you will know that the code you just added was incorrect.

Upvotes: 2

Related Questions