当前位置: 首页 > 知识库问答 >
问题:

如何使用set方法更新firestore中的现有文档

阎慈
2023-03-14

我有一个firestore文档要更新。这是我的密码-

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                name: userName,
                email: email,
            },
            { merge: true },
        );

我正在对“merge:true”对象使用“set”方法。因为如果不存在,我想创建一个新文档,如果存在,我想更新数据。

我试图更新的文档正在被我发送的新属性重写,而不是将数据附加到现有文档中。我读到,使用{merge:true}将传入数据与当前数据合并,但这不起作用。我的整个文档正在被新数据替换。

这是我第一次创建文档时的firestore集合-

这是我更新时的同一份文件-

共有3个答案

扶冠宇
2023-03-14

我是按照弗兰克·范·帕夫伦的建议来做的。如果将来有人需要,这里有正确的代码-

admin
    .firestore()
    .collection('testResult')
    .doc(`${testId}`)
    .get()
    .then(doc => {
        if (doc.exists) {
            admin
                .firestore()
                .collection('testResult')
                .doc(`${testId}`)
                .update({
                    data: admin.firestore.FieldValue.arrayUnion(
                        { userName, email }
                    ),
                });
        } else {
            admin
                .firestore()
                .collection('testResult')
                .doc(`${testId}`)
                .set({
                    data: [{ userName, email }],
                });
            }
        return;
    })
    .catch(error => console.log(error));

首先我检查文档是否存在。如果它不存在,那么我将创建一个新文档并保存一个包含带有我的值的数组的对象。如果它存在,那么我将更新数组。

龚迪
2023-03-14

合并不会创建新字段,它允许您添加不存在的新字段或有选择地更新特定字段。字段名称是唯一的;在您的语句中:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                name: userName,
                email: email,
            },
            { merge: true },
        );

您正在指定字段“名称”(name)和“电子邮件”(email),正如命令所述,它正在将这些字段设置为新值。如果您已经这样做:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                anotherName: userName,
                anotherEmail: email,
            },
            { merge: true },
        );

...它会添加这些字段(如“将新字段合并到文档中”)并保留现有字段nameemail就位

如果您已经这样做:

admin.firestore().collection('testResult').doc(`${testId}`).set(
            {
                anotherName: userName,
                anotherEmail: email,
            },
            { merge: false },
        );

...(注意合并:false)它会将文档设置为

            {
                anotherName: userName,
                anotherEmail: email,
            },

...忽略现有字段。

请记住,字段名在文档中是唯一的-您不会看到这样的文档:

            {
                name: userName1,
                email: email1,
                name: userName2,
                email: email2,
                name: userName3,
                email: email3,
                name: userName4,
                email: email4,
            }

我强烈建议您多研究一下文档,并确切了解Firestore文档的工作原理。

衡子安
2023-03-14

方法(或带有合并标志的集)创建一个文档,该文档可以:

  1. 包含指定字段的值

因此,对于您指定的任何字段,文档中该字段的任何现有值都将被覆盖。

有了这些知识,结果就像预期的那样。

如果要将指定的值附加到该字段的当前值,则需要使用原子事务来读写文档。

如果要存储多个用户名电子邮件组合,则需要在数组字段中进行存储。然后,您可以再次将新组合添加到事务中,或者(如果用户名电子邮件的组合必须是唯一的),您可以使用原子数组联合操作

 类似资料:
  • 我正在与Laravel 5.6与MySql数据库在我的Web应用程序。 我有下面的函数方法来添加顺序, 在我的系统中,我有以下车辆的表名, 现在我需要更新上面的表adtype值从0到1,当点击提交按钮关于上面的addorder函数。那么如何编写代码来更新上面函数中的代码呢???? 我的网址如下...... 路线是,

  • 问题内容: 我有这个POJO课: 这是我的数据库: 有100名学生,有些活跃,有​​些则没有。我想让所有学生都不活跃。 码: 如何使用POJO 更新为false?谢谢! 问题答案: 您可以通过非常简单的方式解决此问题。除了getter之外,还应该像这样为您的属性创建一个setter : 创建了setter之后,就可以像这样直接在对象上使用它: 该代码的结果将是将所有学生对象的active属性更新为

  • 我有这个POJO类: 这是我的数据库: 有100名学生,有些是活跃的,有些不是。我想让所有学生都不活跃。 法典: 如何使用POJO将更新为假?谢谢!

  • 验证后,我试图在/users/处查找用户文档,然后我想使用auth对象中的数据以及一些自定义用户属性更新文档。但我得到一个错误,更新方法不存在。有没有办法更新单个文档?所有firestore文档示例都假定您拥有实际的文档id,并且没有任何示例使用where子句进行查询。

  • 我有一个包含一些图像实体,我想使用HttpPatch方法更新它。 要创建新样式,我使用以下方法: 现在我正在尝试创建一个方法来使用HttpPatch方法更新这个样式。我试过了,但是没有选择在Swagger上上传文件: 这是StyleFiles类: 我正在考虑制作两个单独的endpoint,一个用于更新文件,另一个用于更新实体本身。但我不想那样做。

  • 问题内容: 我读过这篇文章和同一个人的这篇文章,说您无法更新数组元素。 我还阅读了最近的一篇文章,有人说可以用某种方式完成此操作,但是我在文档中都无法获得有关stackoverflow的任何信息。 有什么办法可以解决这个问题?谢谢! 问题答案: 实际上,写这些答案的“家伙”是我:)那时,还没有一种更新数组元素的方法。只能存储数组,而 不能 更新数组成员。 现在,在更新文档时,您可以将第二个参数传递