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() 的函数。

任何帮助,将不胜感激!
能否访问“字段删除”操作取决于您使用的 Firebase SDK 版本:
firebase.firestore.FieldValue.delete().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)
| 归档时间: |
|
| 查看次数: |
1946 次 |
| 最近记录: |