我正在使用Firestore,我想删除特定对象中的字段。 我可以删除文档中的字段,这要归功于:
fieldName: firebase.firestore.FieldValue.delete()
但如果我有一个像这样的对象:
songList {
songName1: "HelloWorld",
songName2: "AnotherSong",
songName3: "andTheLastOne"
}
为了删除字段songName3,我将无法执行以下操作:
songList.songName3: firebase.firestore.FieldValue.delete()
有没有办法删除对象内的字段?或者我应该删除整个对象,在没有第3个字段的情况下重建它并保存它?
提前致谢,
答案 0 :(得分:13)
带有特殊“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
答案 1 :(得分:3)
这对我来说总体来说是
firebase
.firestore()
.collection('collection-name')
.doc('doc-id')
.set({ songlist : {
[songName]: firebase.firestore.FieldValue.delete()
}
}, { merge: true });
答案 2 :(得分:3)
它不允许我在上面发表评论,但 Manuel Borja 的解决方案有效并且非常干净。这是我的使用方法:
db.collection("coolcollection")
.doc(id)
.set(
{
users: {
[firebase.auth().currentUser
.email]: firebase.firestore.FieldValue.delete(),
},
},
{ merge: true }
);
要补充几点:这在地图的给定字段存在和不存在时都有效。
答案 3 :(得分:2)
今天找到了这个主题,并希望添加我的解决方案。我正在使用点符号。下面将使用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;
}
}
答案 4 :(得分:2)
处理地图/对象的简单方法
db.collection('Users').doc('key')
.update({
'products.keytext' : firebase.firestore.FieldValue.delete()
})
.then(() => {
console.log('Success');
})
.catch((e) => {
console.log('Error---->', e);
});
这将从产品图中删除带有键keytext
的对象。
答案 5 :(得分:0)
警告:这不适用于地图,仅适用于数组!
您也许可以将SongList
实现为数组而不是Map。因为对于数组,Firestore现在具有专用功能来从数组中删除元素:
yourRef.update({
songList: firebase.firestore.FieldValue.arrayRemove("SongName3")
});
来源:https://cloud.google.com/firestore/docs/manage-data/add-data#update_elements_in_an_array
答案 6 :(得分:0)
我在使用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)
希望这会有所帮助!
答案 7 :(得分:0)
使用 Map
更新文档,其中包含要删除的键和值 FieldValue.delete()
。
var collection = FirebaseFirestore.instance.collection('collection');
collection
.doc('document_id')
.update(
{
'songList.songName3': FieldValue.delete(),
}
);
答案 8 :(得分:0)
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()
);
答案 9 :(得分:-2)
只需使用您希望包含的对象的值更新文档。无需先删除然后更新。