Firestore - 检查正在更新的文档是否存在

9 浏览
0 Comments

Firestore - 检查正在更新的文档是否存在

据我所知 - 为了检查一个document是否存在,我应该使用get函数并查看它是否存在。

我的问题是关于在更新时进行检查 - 这可行吗? (考虑到更新发生时document可能已经不存在)。

我尝试更新一个空的document,然后收到一个错误消息,表示该文档不存在,但我认为这可能不是一个成功的检查方式。

0
0 Comments

问题的原因是想要在更新文档之前检查文档是否存在。解决方法是使用update方法来执行更新操作。这样设计的目的是为了能够对文档进行部分更新,而不会创建不完整的文档,从而避免代码无法处理的情况。

如果想要判断更新操作是否失败是因为文档不存在,可以在OnFailure中读取错误消息并进行判断。以下是一种检测更新失败的方法:

// 尝试更新文档
documentRef.update("field", "value")
        .addOnSuccessListener(new OnSuccessListener() {
            @Override
            public void onSuccess(Void aVoid) {
                // 更新成功
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // 更新失败
                if (e instanceof FirebaseFirestoreException) {
                    FirebaseFirestoreException firestoreException = (FirebaseFirestoreException) e;
                    if (firestoreException.getCode() == FirebaseFirestoreException.Code.NOT_FOUND) {
                        // 文档不存在
                    }
                }
            }
        });

在上述代码中,我们通过判断异常的类型和错误代码来确定更新操作失败是否是由于文档不存在造成的。

0
0 Comments

Firestore - 检查正在更新的文档是否存在

在使用Firestore进行文档更新时,有时候会遇到要更新的文档不存在的情况。为了解决这个问题,可以使用try-catch语句进行错误处理。

以下是一个示例代码,演示了如何在Firestore中检查要更新的文档是否存在:

try {
  await db.collection('cities').doc('BJ').update('key', 'value');
} catch (error) {
  // 文档不存在,不执行任何操作
}

在这个示例中,代码尝试更新名为'BJ'的cities集合中的文档的键值对。如果文档不存在,会抛出一个错误。通过使用try-catch语句,我们可以捕获这个错误,并在catch块中处理它。

另一个示例代码中,我们使用了Firestore的更新和设置文档的方法来实现类似的功能:

try {
  return await updateDoc(refDoc, {
    allocatedInProjects: increment(1)
  });
} catch (error) {
  return await setDoc(refDoc, {
    allocatedInProjects: 1
  });
}

在这个示例中,updateDoc方法尝试更新refDoc引用的文档的allocatedInProjects字段。如果文档不存在,会抛出一个错误。通过使用try-catch语句,我们可以捕获这个错误,并在catch块中使用setDoc方法创建一个新的文档。

通过使用try-catch语句,我们可以在Firestore中检查正在更新的文档是否存在,并采取相应的操作。这样可以确保我们的代码在进行文档更新时不会因为文档不存在而引发错误。

0
0 Comments

在使用Cloud Firestore写入数据时,有几种方法可以选择:

- update() - 更改已存在文档的字段。如果文档不存在,则操作失败。

- set() - 覆盖文档中的数据,如果文档不存在,则创建文档。如果只想部分更新文档,请使用SetOptions.merge()。

- create() - 仅在服务器端SDK中可用,类似于set(),但如果文档已存在,则操作失败。

因此,你只需要根据你的使用情况选择正确的操作。如果你想要更新文档而不知道文档是否存在,可以使用带有merge()选项的set(),示例如下(以下示例为Java):

// 更新一个字段,如果文档不存在则创建
Map data = new HashMap<>();
data.put("capital", true);
db.collection("cities").document("BJ")
        .set(data, SetOptions.merge());

你可以使用Java编写这个代码吗?实际上我正在使用Firebase for Android。

谢谢。我会问你在上面的答案下已经问过的问题:我能检测操作失败是因为文档不存在吗?

是的,在Android客户端,失败会作为FirebaseFirestoreException异常返回,其中包含一个Code。在这种情况下,你会看到Code.ALREADY_EXISTS。

update()方法如果文档中不存在某个字段,会失败吗?比如我有一个文档{firstname: "John"},然后我调用doc.update({lastname: "Doe"}),会有问题吗?

不会,这将成功执行。

在JavaScript中,第二个参数只是一个对象,所以代码会变成:`db.collection("cities").document("BJ").set(data, {merge: true});`我在这里写这个代码是因为这个问题是在谷歌上搜索"firestore update if exists"的第一个结果。

0