如何在Firestore中创建数字数组并完成数组更新操作
Firestore数组追加更新解决方案
问题原因
你现有代码的逻辑是将RefNumber字段赋值为单个对象,本身不符合数组结构要求,哪怕使用SetOptions.merge(),也会直接覆盖整个RefNumber字段的原有内容,自然无法实现新参考编号追加的效果。
去重追加实现(推荐)
Firestore提供了FieldValue.arrayUnion()方法专门用于数组元素追加,操作是原子性的,且会自动对重复元素去重,如果RefNumber字段不存在会自动创建数组:
import com.google.firebase.firestore.FieldValue; // 构造要追加的参考编号条目 Map<String, Object> newRefItem = new HashMap<>(); newRefItem.put("Refnum", f_refrenceNum); // 构造更新参数 Map<String, Object> updateMap = new HashMap<>(); updateMap.put("RefNumber", FieldValue.arrayUnion(newRefItem)); // 执行更新 upiRefnum.update(updateMap);
允许重复元素追加实现
如果业务需要存储重复的参考编号,采用先读取现有数组、本地追加后写回的方式:
upiRefnum.get().addOnSuccessListener(documentSnapshot -> { // 读取现有数组,不存在则初始化 List<Map<String, Object>> refList = (List<Map<String, Object>>) documentSnapshot.get("RefNumber"); if (refList == null) { refList = new ArrayList<>(); } // 追加新元素 Map<String, Object> newRefItem = new HashMap<>(); newRefItem.put("Refnum", f_refrenceNum); refList.add(newRefItem); // 写回更新 upiRefnum.update("RefNumber", refList); });
注意事项
FieldValue.arrayUnion()是原子操作,不会出现并发写入覆盖的问题,优先推荐使用- 如果需要移除数组中的指定元素,替换为
FieldValue.arrayRemove(待移除元素)即可
内容的提问来源于stack exchange,提问作者Avni Krtigya
相关产品推荐
相关产品推荐

