Я использую Firestore в своем приложении, и у меня есть поле карты под названием «голоса» для голосов пользователей за или против. Это выглядит так:
Я хочу добавить возможность удалить элемент оттуда, вот что я получил сейчас:
//getting the user's votes dictionary and removing the post from it.
userRef.getDocument { (doc, error) in
if let _ = error { completion(false) }
guard let dict = doc?.data()?[USER_VOTES] as? [String: Any] else { return }
currentDict = dict
currentDict.removeValue(forKey: id)
}
//setting the votes dictionary with the updated one.
userRef.setData(currentDict) { (error) in
if let _ = error { completion(false) }
else { completion(true) }
}
для меня это выглядит не очень эффективно, потому что каждый раз, когда пользователь пытается удалить элемент из этого словаря, мне приходится писать в базу данных. что может замедлить процесс, и, насколько я понимаю, бесплатный уровень Firestore ограничивает количество операций записи. Есть ли лучший способ, может быть, удалить его прямо из документа пользователя? Я пытался найти ответы, но не смог найти ничего, что сработало бы для меня. Вот, например: Удаление элемента словаря в Firebase выглядит так, как мне нужно сделать, но я не мог заставить его работать.
РЕДАКТИРОВАТЬ: я пытался удалить это так
userRef.updateData([
USER_VOTES:[
id: FieldValue.delete()
]
]) { (error) in
if let _ = error { completion(false) }
}
Приложение вылетает пишет:
Terminating app due to uncaught exception 'FIRInvalidArgumentException', reason: 'FieldValue.delete() can only appear at the top level of your update data
FieldValue.delete()
, чтобы вызвать отдельное поле карты для удаления. Вам нужно будет использовать точечную нотацию значения поля, чтобы идентифицировать конкретное поле (например, voices.XXX). firebase.google.com/docs/firestore/manage-data/ - person Doug Stevenson   schedule 26.11.2019