【问题标题】:Cannot update/delete Firestore field with "period" in the name无法更新/删除名称中带有“句点”的 Firestore 字段
【发布时间】:2018-05-27 20:49:09
【问题描述】:

我正在尝试更新/删除 Firestore 文档中的字段,但名称中带有“句点”的字段在尝试更新/删除时似乎静默失败。我有句号的原因是我使用 URL 作为对象中的键,我觉得这是一个半常见的用例。

例子:

首先创建文档(这工作正常)

db.collection("data").doc("temp").set({
  helloworld: {
      key1: 'foo'
  },
  hello.world: {
      key1: 'bar'
  }
})

如果您尝试删除没有句点的元素,它可以正常工作。

db.collection("data").doc("temp").update({
    helloworld: firebase.firestore.FieldValue.delete()
})
// Value is Deleted

如果您尝试删除带有句点的元素,它不会执行任何操作。

db.collection("data").doc("temp").update({
    hello.world: firebase.firestore.FieldValue.delete()
})
// Nothing Happens!

我也试过

let u = {}
u['hello.world'] = firebase.firestore.FieldValue.delete()
db.collection("data").doc("temp").update(u)
// Nothing Happens!

这是一个错误吗?是否支持字段名称中的句点?我可以创建元素但不能删除它,这似乎很奇怪。

【问题讨论】:

    标签: javascript google-cloud-firestore


    【解决方案1】:

    其他答案都不适合我,最接近的答案缺少 new() 关键字,这对我有用

    let fpath = new firestore.firestore.FieldPath(`hello.${world}`);
    doc.update(
        fpath,
        firestore.firestore.FieldValue.delete()
    );
    

    【讨论】:

      【解决方案2】:

      当您在更新或删除名称中使用句点时,您需要将其括在引号中,例如:

      db.collection("data").doc("temp").update({
        "hello.world": firebase.firestore.FieldValue.delete()
      })
      

      或者对于动态名称:

      [`hello.${world}`]: firebase.firestore.FieldValue.delete()
      

      【讨论】:

      • 很有趣,我会尝试一下,如果可行,我会将此标记为已接受的答案。仍然奇怪的是“set”不带引号但“update”不带引号。
      • Set 作用于对象型数据,update 作用于键值型数据。
      • 不幸的是,我的键是动态的,因此无法提供字符串文字来执行此方法。
      【解决方案3】:

      如果您使用动态键并且 J Livengood 的解决方案不适合您,我找到了一种解决方法。您可以使用带有“merge:true”的“set”方法来选择性地设置具有删除值的键。

      var dynamicKey = "hello.world"    
      
      // ES6
      db.collection("data").doc("temp").set({ 
          [dynamicKey]: firebase.firestore.FieldValue.delete()
      }, { merge: true })
      
      
      // ES5
      var obj = {}
      obj[dynamicKey] = firebase.firestore.FieldValue.delete()
      db.collection("data").doc("temp").set(obj, { merge: true })
      

      【讨论】:

        【解决方案4】:

        更新操作将hello.world 读取为指向名为word 的字段的点分隔路径,该字段嵌套如下:

        {
          hello: {
           world: "Some value"
          }
        }
        

        如果您有一个名称中有一个点的字段,您需要使用FieldPath 在更新中逐字引用它: https://firebase.google.com/docs/reference/js/firebase.firestore.FieldPath

        这就是你想要的:

        doc.update(
          firebase.firestore.FieldPath("hello.world"), 
          firebase.firestore.FieldValue.delete());
        

        【讨论】:

        • 我收到一个错误:函数 DocumentReference.update() 需要 1 个参数,但调用时使用了 2 个参数。
        • @SandeepDinesh 你在使用网络客户端吗?不应该是这样:firebase.google.com/docs/reference/js/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2021-08-12
        • 2019-02-22
        • 2021-12-25
        • 2020-10-31
        相关资源
        最近更新 更多