Firestore - 删除对象内的字段
Posted
技术标签:
【中文标题】Firestore - 删除对象内的字段【英文标题】:Firestore - Delete a field inside an object 【发布时间】:2018-06-17 04:13:34 【问题描述】:我正在使用 Firestore,我想删除特定对象中的字段。 我可以删除文档中的字段,感谢:
fieldName: firebase.firestore.FieldValue.delete()
但是如果我有一个像这样的对象:
songList
songName1: "HelloWorld",
songName2: "AnotherSong",
songName3: "andTheLastOne"
为了删除字段 songName3,我将无法执行以下操作:
songList.songName3: firebase.firestore.FieldValue.delete()
有没有办法删除对象内的字段?或者我应该删除整个对象,在没有第三个字段的情况下重建它并保存它?
提前致谢,
【问题讨论】:
这对我有用:***.com/a/47555348/5532513 【参考方案1】:带有特殊“FieldValue.delete()”的“点符号”应该可以工作。
试试这个:
Map<String, Object> deleteSong = new HashMap<>();
deleteSong.put("songList.songName3", FieldValue.delete());
FirebaseFirestore.getInstance()
.collection("yourCollection")
.document("yourDocument")
.update(deleteSong);
它对我有用。
见:https://firebase.google.com/docs/firestore/manage-data/delete-data https://firebase.google.com/docs/firestore/manage-data/add-data
【讨论】:
【参考方案2】:一般来说这对我有用
firebase
.firestore()
.collection('collection-name')
.doc('doc-id')
.set( songlist :
[songName]: firebase.firestore.FieldValue.delete()
, merge: true );
【讨论】:
【参考方案3】:今天发现了这个话题,想添加我的解决方案。我正在使用点符号。以下将使用firestore.FieldValue.delete();
从歌曲列表中删除特定歌曲。我正在使用用 TypeScript 编写的 Node.js firebase-admin 包:
import * as admin from 'firebase-admin';
export async function removeSong(trackId: string, song: string)
try
const updates = ;
// Dot Notation - will delete the specific song from songList
updates[`songList.$song`] = admin.firestore.FieldValue.delete();
// Not necessary, but it's always a good practice
updates['updatedAt'] = admin.firestore.FieldValue.serverTimestamp();
await firestore.collection('songs').doc(trackId).update(updates);
return true
catch (error)
return null;
【讨论】:
使用您的解决方案,我能够删除对象内的嵌套字段。但是,我使用了 firebase.firestore 而不是 admin.firestore。它似乎也能正常工作。【参考方案4】:它不允许我在上面发表评论,但 Manuel Borja 的解决方案有效并且非常干净。这是我的使用方法:
db.collection("coolcollection")
.doc(id)
.set(
users:
[firebase.auth().currentUser
.email]: firebase.firestore.FieldValue.delete(),
,
,
merge: true
);
要补充几点:当地图的给定字段存在和不存在时,这都有效。
【讨论】:
【参考方案5】:我在使用 Kotlin 的 android 中遇到了同样的问题,我也用点表示法解决了这个问题。对于 Android Kotlin 用户,即:
val songName: String = "songName3"
val updatesMap = HashMap<String, Any>()
updatesMap["songList.$songName"] = FieldValue.delete()
FirebaseFirestore.getInstance()
.collection("Your Collection")
.document("Your Document")
.update(updatesMap)
希望这会有所帮助!
【讨论】:
【参考方案6】:处理地图/对象的更简单方法
db.collection('Users').doc('key')
.update(
'products.keytext' : firebase.firestore.FieldValue.delete()
)
.then(() =>
console.log('Success');
)
.catch((e) =>
console.log('Error---->', e);
);
这将从产品映射中删除带有键 keytext
的对象。
【讨论】:
【参考方案7】:注意:这不适用于地图,仅适用于数组!
您也许可以将SongList
实现为数组而不是映射。因为对于数组,Firestore 现在有一个专门的函数来从数组中删除一个元素:
yourRef.update(
songList: firebase.firestore.FieldValue.arrayRemove("SongName3")
);
来源:https://cloud.google.com/firestore/docs/manage-data/add-data#update_elements_in_an_array
【讨论】:
【参考方案8】:使用 Map
更新文档,其中包含要删除的键和值 FieldValue.delete()
。
var collection = FirebaseFirestore.instance.collection('collection');
collection
.doc('document_id')
.update(
'songList.songName3': FieldValue.delete(),
);
【讨论】:
【参考方案9】:const deleteField = async () =>
const FieldValue = firestore.FieldValue;
const itemRef = firestore().collection('COLLECTION-NAME').doc('DOCUMENT-NAME');
const res = await itemRef.update(
'ELEMENT-NAME', FieldValue.delete() //'ELEMENT-NAME' OR Object.Field which equals to Parent Field Name.
);
e.g.
12345: you: 'You', me: 'Me', we: '12345' ,
56789: you: 'You', me: 'Me', we: '56789' ,
const res = await itemRef.update(
object.we, FieldValue.delete() //OR '12345', FieldValue.delete()
);
【讨论】:
虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。以上是关于Firestore - 删除对象内的字段的主要内容,如果未能解决你的问题,请参考以下文章