删除 Firestore 中的嵌套字段

Lil*_*ili 1 firebase typescript react-native google-cloud-firestore

我正在尝试删除 Firestore 中的嵌套字段,但我得到FirebaseError: Function updateDoc() called with invalid data. deleteField() can only appear at the top level of your update data

所以我要删除的是称为面包、盐等的各个字段(地图)。

消防站的图片

const listRef = doc(db, "lists", list.id);
const onDismiss = useCallback(async (id: string) => {
    const onGoingIndex = onGoingItems.findIndex((item) => item.id === id);
    let getName = onGoingItems.find((item) => item.id === id)?.name || "";
 

    if (onGoingIndex !== -1) {
      onGoingItems.splice(onGoingIndex, 1);
    } else {
      const doneIndex = doneItems.findIndex((item) => item.id === id);
      getName = doneItems.find((item) => item.id === id)?.name || "";
      doneItems.splice(doneIndex, 1);
    }

    await updateDoc(listRef, {
      items: {
        [getName]: deleteField(),
      },
    });
  }, []);
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 firebase/firestore 中的 FieldValue.delete() ,但它没有名为 delete() 的函数。 字段值错误

任何帮助,将不胜感激!

sam*_*man 6

能否访问“字段删除”操作取决于您使用的 Firebase SDK 版本:

  • 对于 v8 及更早版本(或 v9 兼容模式),您使用firebase.firestore.FieldValue.delete().
  • 对于 v9 及更高版本,您使用deleteField()(如您的情况)
  • 对于react-native-firebase,您当前使用firestore.FieldValue.delete()(基于文档,正如@AlekssandarNikolic在其答案中指出的那样)。

您无法使用的原因FieldValue.delete()是它在 SDK v9 中被删除,取而代之的是deleteField().

但是,正如该错误告诉您的那样,“删除字段”标记只能出现在更新数据的顶层。这是因为 Firestore 处理嵌套对象中的更新字段以防止删除错误数据的方式所致。

使用您编写的代码,您将把整个对象更新为getName,这也会删除。"Bread" items{ Bread: <deleteMe> }"Salt"

await updateDoc(listRef, {
  items: {
    [getName]: deleteField(),
  },
});
Run Code Online (Sandbox Code Playgroud)

要纠正此问题,请使用要更改的字段的点表示法(这将正确地保留其他嵌套字段):

await updateDoc(listRef, {
  [`items.${getName}`]: deleteField()
});
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅更新嵌套字段(和删除字段)。