Firebase带WHERE条件批量更新发帖用户名时非目标用户数据被误改问题
问题原因
你写的查询逻辑存在低级错误:在构造完带where过滤条件的查询后,额外调用了.ref属性,这个操作会直接返回整个post集合的根引用,之前附加的用户ID过滤条件会被完全清空,最终你查询到的是库中所有的帖子,自然会批量修改所有用户的发帖昵称。
修复方案
去掉多余的.ref调用,直接对构造完成的带过滤条件的查询执行get()方法即可。
修正后代码
async updateAll(username) { const batch = this.afs.firestore.batch(); // 直接对带where过滤的查询执行get,不需要加.ref const userPostsQuery = this.afs .collection('post', (ref) => ref.where('postedById', '==', this.cUser)) .get(); (await userPostsQuery).forEach((doc) => { batch.update(doc.ref, { postedBy: username, }); }); return batch.commit(); }
额外注意事项
- Firebase的批量写入单次最多支持500条操作,如果单用户发帖量超过500,需要拆分多批执行,避免触发上限报错
- 建议配套配置Firestore安全规则,限制用户只能修改
postedById等于自身UID的帖子,就算前端逻辑出问题也不会影响其他用户的数据
内容的提问来源于stack exchange,提问作者John Paulo A. Geronimo
相关产品推荐
相关产品推荐

