【问题标题】:Firestore - Check if the document which is being updated existsFirestore - 检查正在更新的文档是否存在
【发布时间】:2018-03-23 14:46:09
【问题描述】:

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

我的问题是关于更新时的检查 - 有可能吗?(考虑到更新发生时document 可能会消失)。

我尝试更新一个空的document,但我收到一个错误,提示该文档不存在,但我认为这可能不是检查此问题的成功方法。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    有几种方法可以将数据写入 Cloud Firestore:

    • update() - 更改已存在文档上的字段。如果文档不存在则失败。
    • set() - 覆盖文档中的数据,如果文档不存在则创建该文档。如果您只想部分更新文档,请使用SetOptions.merge()
    • create() - 仅在服务器端 SDK 中可用,类似于 set(),但如果文档已存在则失败。

    因此,您只需要针对您的用例使用正确的操作即可。如果你想在不知道它是否存在的情况下更新一个文档,你想像这样使用set()merge() 选项(此示例适用于Java):

    // Update one field, creating the document if it does not already exist.
    Map<String, Object> data = new HashMap<>();
    data.put("capital", true);
    
    db.collection("cities").document("BJ")
            .set(data, SetOptions.merge());
    

    【讨论】:

    • 你能用Java写这个吗?我实际上使用的是 Android 版 Firebase。
    • 谢谢。我会问你我在上面的答案下问了什么:我可以检测操作是否失败,具体是因为文档不存在吗?
    • 是的,在 Android 客户端中,故障来自 [FirebaseFirestoreException][1],其中包含 [Code][2]。在这种情况下,您将看到 Code.ALREADY_EXISTS。 [1]:firebase.google.com/docs/reference/android/com/google/firebase/… [2]:firebase.google.com/docs/reference/android/com/google/firebase/…
    • 如果文档中不存在字段,更新是否仍会失败?因此,如果我有一个文档 {firstname: "John"} 并且我调用 doc.update({lastname: "Doe"}) 会好吗?
    • @DevShadow 将会成功。
    【解决方案2】:

    如果您只想在文档存在的情况下执行更新,那么使用update 就是正确的做法。您观察到的行为是您可以信赖的行为。

    我们对此进行了专门设计,以便可以对文档执行部分更新,而不会创建您的代码无法处理的不完整文档。

    【讨论】:

    • 那么我应该阅读 OnFailure 中的消息,而不是检测它是否因为文档不存在而发生?有没有一种好方法可以检测更新是否因此而失败?
    • @TalBarda 见下文。您应该使用适当的操作写入数据。
    【解决方案3】:

    我们可以进行更新并将掩码参数设置为 true 像这样:-

    firestore.updateDocument("GFrom/"+data.email,data, true);
    

    【讨论】:

      【解决方案4】:

      尝试更新不存在的文档的最简单方法是:

      try {
        await db.collection('cities').doc('BJ').update('key', 'value')
      } catch (error) {
        // document not exists, do nothing  
      }
      

      【讨论】:

        【解决方案5】:

        我认为在这种情况下,带有 merge: trueset() 是最好的选择。 使用颤振

        firestoreInstance.collection("users").doc(firebaseUser.uid).set(
        {
        "username" : "userX",
        },SetOptions(merge: true))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-22
          • 2020-10-05
          • 1970-01-01
          • 2021-11-09
          • 2019-04-19
          • 1970-01-01
          • 2018-04-03
          • 2021-11-25
          相关资源
          最近更新 更多