我有一个应用程序,人们可以要求食物,然后我有订单,每个订单都有该订单的状态,所以我做了一个功能,每次该订单的状态发生变化时都会发送用户通知,状态可以由接受订单的商店和订单完成时的用户更改。
但是我希望将此函数的执行限制为仅2个字段,userId和status字段,因为现在我有了onUpdated,无论何时更新此文档,此触发器都会启动。
我计划更新此文档的uid和status以外的其他字段,并且不希望触发器再次重新启动,并在不需要时向用户发送通知。
是否可以通过文档中的某些字段来限制触发器?
exports.onOrderUpdated = functions.firestore
.document('orders/{orderId}').onUpdate((change, context) => {
var db = admin.firestore();
try{
const orderDataSnap = change.after.data();
var userId = orderDataSnap.uid;
var orderStatus = orderDataSnap.status;
}catch(error){
return handleErrorToUser(error);
}
这里我只想在文档中的userId和状态发生变化时执行这个函数
有办法做到这一点吗?
谢谢
2条答案
按热度按时间xzlaal3s1#
根据Change的文档,有
before
和after
snapshots。你可以在每个副本上调用
data()
方法,检查userId
和status
在before和after副本中是否相等。如果相等,就提前返回函数。sqyvllje2#
不,只有当文档的某些特定字段发生更改时,才有可能触发云函数。正如samdy1在他的回答中所解释的那样,您可以在云函数中检测哪些字段发生了更改,但是需要触发云函数。
一种解决方案是在进行更改的同时将文档写入另一个专用集合。
例如,如果您正在使用新的
status
更新文档,则将文档写入集合statusUpdates
,其中包含父订单文档的ID和状态值,并基于此文档创建触发Cloud Function。当然,这意味着创建一个文档,并且它有一个成本(除了CF触发之外)。这取决于你做数学,取决于更新的频率,来计算这种方法是否比免费触发订单文档的云函数的方法更便宜。