Firebase Firestore如何单独更新feelings map下的likes、dislikes、fav字段

你出现整个feelings map被覆盖的核心原因是Firestore更新嵌套Map内的字段时,需要使用点表示法指定完整的嵌套字段路径,不能直接将父级Map的key作为更新字段,否则会直接覆盖整个父级Map。
另外你当前的代码逻辑存在两处冗余问题:
- 不需要先修改本地存储的
course.feelings.fav数组再全量上传,直接使用Firestore提供的FieldValue.arrayUnion、FieldValue.arrayRemove即可完成原子性的数组元素增删,还能避免并发修改冲突 - 多次执行
db.runBatch属于不必要的操作,整个逻辑只需要一次批量更新即可完成
修正后的代码示例
val isFav = course.feelings.fav.contains(currentUser.email) val operate = if (isFav) { FieldValue.arrayRemove(currentUser.email) } else { FieldValue.arrayUnion(currentUser.email) } db.runBatch { batch -> // 用点表示法指定更新feelings下的fav字段,不会影响同层级的likes、dislikes batch.update(noteRef, "feelings.fav", operate) batch.update(favNoteRef, "feelings.fav", operate) } // 批量更新执行成功后再修改本地course对象同步状态 if (isFav) { course.feelings.fav.remove(currentUser.email) } else { course.feelings.fav.add(currentUser.email) }
如果要实现点赞、点踩的独立更新,只需要把字段路径里的fav替换为对应的likes、dislikes即可,三个字段的更新完全互不干扰。
内容的提问来源于stack exchange,提问作者Hitesh Patel
相关产品推荐
相关产品推荐

