Firebase Firestore如何添加数据而不覆盖旧数据?

8
我正在尝试向我的Firestore数据库添加数据。Firestore数据库如下:

enter image description here

我有一个PHP文件,使用以下代码将数据加载到其中:db.collection('events').doc('documentNameUsingUniqueEventID').set({id1:data1, id2:data2, id3:data3, ...}); 但是,当我加载新数据并且旧数据仍然存在时,文档会被覆盖,我会失去所做的更改。有没有一种方法可以添加数据而不覆盖现有数据?

你是否总是想要创建一个带有新ID的新文档?如果是这样,使用.add而不是.set(不包括.doc()引用)。如果您想指定文档ID,则可以.set新文档并.update后续写入。如果您不知道正在使用的ID是否存在,则Doug的方法.set(data,{merge:true})应该最适合您。 - Jason Berryman
每当我调用php文件时,我总是使用.set,因为我从txt文件中获取json。问题在于,在json中,我将唯一事件ID作为ID,而不是由firestore自动生成的ID。因此,当我调用php时,即使我使用merge:true,它也会覆盖所有数据。我只想在调用php时保留参与者和年龄平均值。 - Dennis
.set(data, {merge: true}) 应该可以完全实现你想要的功能。但是,我不熟悉 PHP SDK。这里可能存在一些不一致性。你需要联系一位了解 PHP SDK 的 Firebase 开发者。抱歉! - Jason Berryman
{merge: true}不会覆盖未发送的数据,但我总是发送participants: 0和ageAverage: 0。您有什么建议可以解决我的问题吗? - Dennis
4个回答

18

set()方法在DocumentReference上有第二个参数SetOptions,它允许您声明要将数据合并到现有文档中而不是覆盖它:

db.collection('events')
    .doc('documentNameUsingUniqueEventID')
    .set(data, { merge: true });

我已经尝试过了,但它不起作用。我从Android应用程序更新参与者和年龄平均值,并通过PHP从服务器上传新事件。在PHP数据参数中,我将参与者和年龄平均值设置为0,当我使用merge:true进行.set()时,它仍然会将它们覆盖为0。 - Dennis
1
@Doug Stevenson退出了,如果不存在,则有没有任何方法插入一些值并更新(使用合并)其他值?在同一语句中?就像SQL合并一样。 - IoT user
1
现在对我来说是:.set(user, SetOptions(merge: true)); - Dannark

7
使用.add在一个集合上添加带有自动ID的数据。
使用.set文档上完全覆盖它。
使用.update文档上更新它的一部分。
你也拼错了participants

1
现在你可以通过 SetOptions.merge() 启用集合合并,例如。
db.collection('events')
    .doc('documentNameUsingUniqueEventID')
    .set(data, SetOptions.merge());

0

我使用.update()和{merge: true}解决了我的问题。我没有在php中传递participants和ageAverage,但当我需要上传数据时,我会创建它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接