【问题标题】:Delete item from subcollection array in Firestore Firebase从 Firestore Firebase 的子集合数组中删除项目
【发布时间】:2020-05-28 22:26:42
【问题描述】:
我正在尝试从名为 items 子集合的配置文件集合中的数组中删除项目。每当从主项目集合中删除项目时,都应该触发函数。以下功能的问题是,当触发它时,它会从配置文件中删除所有项目,而不是仅删除一个。我如何遍历项目数组并检查已删除的项目 ID。
exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onDelete((snap, context) => {
const { itemId } = context.params
const deletedItem = snap.data()
if(deletedItem){
db.collection('profiles')
.doc(deletedItem.user.id)
.update({
items: admin.firestore.FieldValue.delete({
id: itemId,
title: deletedItem.title,
price: deletedItem.price,
image: deletedItem.image
})
})
}
return true
})
【问题讨论】:
标签:
javascript
firebase
google-cloud-firestore
【解决方案1】:
onDelete 触发器仅在删除整个文档时触发。到了这个时候,已经太晚了——文件已经消失了。某些东西选择了删除它,而您将无法分辨是什么。
如果您希望在修改文档的任何部分时触发函数,则应改用onUpdate 触发器。这将为您提供更改前后文档的全部内容。您将不得不比较它们以找出具体变化的内容。
【解决方案2】:
我还尝试使用 onUpdate 触发器删除数据以及 onWrite 触发器以在数据更改时侦听任何更改,但是在这两种情况下它都没有给我任何关于删除数据的部分的结果。配置文件集合中的项目子集合保持不变。我不确定函数的错误在哪里,函数执行没有显示任何错误,完成状态为 Ok....
exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onUpdate((change, context) => {
const { itemId } = context.params
const beforeItem = change.before.data()
const updatedItem = change.after.data()
if (updatedItem === null) {
return db.collection('profiles')
.doc(beforeItem.user.id)
.delete({
items: admin.firestore.FieldValue.arrayRemove({
id: itemId,
title: beforeItem.title,
price: beforeItem.price,
image: beforeItem.image,
status: beforeItem.status,
})
})
}
return true
})
exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onUpdate((change, context) => {
const { itemId } = context.params
const beforeItem = change.before.data()
const updatedItem = change.after.data()
if (updatedItem === null) {
return db.collection('profiles')
.doc(beforeItem.user.id)
.update({
items: admin.firestore.FieldValue.delete({
id: itemId,
title: beforeItem.title,
price: beforeItem.price,
image: beforeItem.image,
status: beforeItem.status,
})
})
}
return true
})