我需要将一个项目添加到我的文档内的列表中。不幸的是,我的代码总是覆盖旧值。如何更改代码以始终添加新项目?
db = FirebaseFirestore.getInstance();
String userid = FirebaseAuth.getInstance().getCurrentUser().getUid();
db.collection("Users").document(userid);
Map<String, Object> docData = new HashMap<>();
Map<String, Object> nestedData = new HashMap<>();
nestedData.put("Ernährung2", true);
docData.put("channelAbos", nestedData);
db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData);
答案 0 :(得分:0)
According to the documentation,用一个参数调用的set()每次都会覆盖整个文档。
如果文档不存在,将创建该文档。如果文件 确实存在,其内容将被新提供的内容覆盖 数据
如果要将值添加到现有列表,则应使用same page of documentation中所述的FieldValue.arrayUnion():
如果您的文档包含一个数组字段,则可以使用arrayUnion()和 arrayRemove()添加和删除元素。 arrayUnion()添加元素 到一个数组,但只有不存在的元素。
我要指出的是,您现在使用Map正在执行的操作将创建一个对象,而不是列表。请确保您具有列表/数组类型字段,而不是要使用的对象。
答案 1 :(得分:0)
关于official documentation所说的SetOptions merge()
方法:
更改set()调用的行为,以仅替换其data参数中指定的值。 set()调用中省略的字段将保持不变。
因此,SetOptions.merge()
方法将仅替换fieldPaths下的字段。在fieldPaths中未指定的任何字段都将被忽略,并且保持不变。
结论是,如果文档不存在,则会创建该文档。如果该文档确实存在,则其内容will be overwritten
中包含新提供的数据,除非您指定应将数据合并到现有文档中。因此,要解决此问题,请更改以下代码行:
db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData);
到
db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData, SetOptions.merge());