Flutter如何在Firestore中实现数组的条件新增或更新操作?
解决方案
直接将FieldValue.arrayUnion与SetOptions(merge: true)搭配使用即可,无需额外做字段/文档存在性校验,Firestore会自动处理所有场景:
- 若目标文档不存在:自动创建文档,同时生成
sets数组并写入待添加元素 - 若目标文档存在但
sets字段不存在:自动新增sets数组字段并写入元素 - 若
sets数组已存在:正常执行数组追加操作,不会覆盖原有元素
示例代码如下:
await workoutDoc .collection("exercises") .doc(exerciseId) .set( {"sets": FieldValue.arrayUnion(sets)}, SetOptions(merge: true) );
原方案问题说明
你之前调用set方法时传入的是完整的exercise对象,其中sets是普通数组值,merge模式下会直接覆盖现有sets字段的值。现在改为仅传入用arrayUnion包裹的sets字段操作,Firestore会识别这是数组追加指令,而非字段值替换指令。
补充说明:若你可以保证目标文档一定存在,也可以直接用原update方法,Firestore的update操作本身也支持对不存在的数组字段执行
arrayUnion,会自动创建数组。只有当目标文档不存在时,update才会抛出异常,此时用上面的set+merge方案兼容性更强。
内容的提问来源于stack exchange,提问作者who-aditya-nawandar
相关产品推荐
相关产品推荐

