Как удалить поле из массива в Firestore?

# #android #firebase #kotlin #google-cloud-firestore

Вопрос:

введите описание изображения здесь

Я хочу удалить определенное поле (это идентификатор пользователя) из массива в Firestore.

Я стараюсь:

  override fun unlikePost(postId: String) {
        FirebaseFirestore.getInstance().collection(postCollection)
            .document(postId).update("likeList", FieldValue.arrayRemove(FirebaseAuth.getInstance().uid))
    }
 

Но когда я это сделаю, мой список вероятностей в Firestore изменится на:

[]

Почему unlikePost не удаляет конкретное поле, а очищает весь массив и меняет его на []?

Комментарии:

1. Было ли в поле больше значений, чем то, которое вы показываете на скриншоте?

2. Да, были. Когда я вызываю свою функцию, она удаляет все поля из списка массивов.

Ответ №1:

Как удалить поле из массива в Firestore?

Звонок в:

 .update("likeList", FieldValue.arrayRemove(FirebaseAuth.getInstance().uid))
 

Действительно так делает. Это означает, что вы удаляете идентификатор пользователя, прошедшего проверку подлинности, из массива «Список вероятностей». Однако это не означает, что вы полностью удаляете массив из документа, следовательно, это представление. Два тормоза [] представляют собой пустой массив.

Итак, как вы можете удалить весь массив из документа? Вы можете подумать, что передача значения null может помочь, но это не так, поскольку null является поддерживаемым типом данных в Firestore. Итак, звонок в:

 .update("likeList", null)
 

Это приведет к:

 Firestore-root
   |
   --- posts (collection)
        |
        --- postId (document)
             |
             --- likeList: null (array)
 

Если вы хотите полностью избавиться от массива из документа, вам следует использовать вызов:

 .update("likeList", FieldValue.delete())
 

Таким образом, ваш массив будет удален из документа независимо от того, сколько идентификаторов UID существует в массиве.

Редактировать:

Согласно вашему последнему комментарию:

Например, в массиве есть 5 идентификаторов UID. Я хочу удалить только один конкретный. Теперь, когда я пытаюсь это сделать, я очищаю весь массив.

Предположим, у вас есть массив, содержащий два идентификатора UID, один из которых «abc», а второй — «xyz». Последним является UID аутентифицированного пользователя. Если вы хотите удалить «abc», вам следует позвонить по:

 .update("likeList", FieldValue.arrayRemove("abc"))
 

Если вы хотите удалить второй, вам следует использовать:

 .update("likeList", FieldValue.arrayRemove("xyz"))
 

Или:

 .update("likeList", FieldValue.arrayRemove(FirebaseAuth.getInstance().uid))
 

Потому FirebaseAuth.getInstance().uid что возвращает «xyz».

Комментарии:

1. Я думаю, что здесь какое-то недоразумение. Я не хочу удалять или очищать массив. Я хочу удалить определенный элемент из списка массивов(в этом случае это текущий идентификатор пользователя).

2. До тех пор, пока у вас изначально был массив, содержащий UID ( PNke...7vK2 ), и вы использовали .update("likeList", FieldValue.arrayRemove(FirebaseAuth.getInstance().uid)) его для его удаления, массив оставался пустым, верно? Тогда в чем проблема?

3. Например, в массиве есть 5 идентификаторов UID. Я хочу удалить только один конкретный. Теперь, когда я пытаюсь это сделать, я очищаю весь массив.

4. Пожалуйста, проверьте мой обновленный ответ. Теперь все в порядке?

5. @Wafi_ck Если ответ Алекса еще не объясняет решение, можете ли вы отредактировать свой вопрос, чтобы показать скриншоты до и после документа, чтобы показать проблему?