Flutter-Firestore:如何向已存在数组添加重复值?
向Firestore数组重复添加元素的最优方案
Firestore 原生的 arrayUnion() 本身就是为去重场景设计的,没法直接用它实现重复元素的追加。但不用非得读取整个文档重写,有两个更高效的方案:
改用带唯一标识的对象数组
给每个要添加的元素附加一个唯一标识(比如时间戳、UUID),把单值改成对象结构。这样即使内容重复,因为标识不同,arrayUnion()会将其视为新元素执行原子添加,无需读取整个文档。示例代码:'unitsLog': FieldValue.arrayUnion({ value: update, id: Date.now() })用事务实现纯值数组的重复追加
如果必须保持纯值数组结构,可以通过 Firebase 事务来操作:事务内部会先读取目标文档的数组字段,直接将新值追加进去,再写回文档。这种方式虽然需要读取文档,但事务能保证并发场景下的数据一致性,比客户端自行读取再写入的两步操作更可靠,也避免了冲突问题。
另外提个小细节:你当前代码里的 arrayUnion([update]) 没必要把参数包成数组,直接写 FieldValue.arrayUnion(update) 就可以(如果要一次性加多个元素,才需要传数组,比如 arrayUnion(val1, val2) 或 arrayUnion(...valsArray))。
内容的提问来源于stack exchange,提问作者Dennis Ashford
相关产品推荐
相关产品推荐

