我有一个定时函数,用于将我的firestore中的整数值重置为零。我遇到的问题是,虽然合并设置成功(对于指定的属性),但它会将我的Organization
文档引用重置为null。
目前为止,我尝试了以下方法:
- 不使用转换器与
Update()
函数(而不是Set()
)。虽然这可以工作,但它是不带类型的,并且我必须放弃封装moment()到Date转换的转换器。 - 使用
Set()
并简单地传递整个对象。
user.reference?.withConverter(userConverter).set(user)
这个也可以工作,但会覆盖整个用户对象,在定时函数运行时可能会导致并发问题。
我正在寻找一种解决方案,允许我在使用转换器类的同时与合并Set()
一起使用。
User
接口如下所示:
export interface User extends Document {
email?: string
name?: string
organization?: Organization | null
numberOfForwards?: number
lastForwardReset?: moment.Moment
}
使用其类似于转换器的功能。
export class UserConverter implements firestore.FirestoreDataConverter<User> {
toFirestore(user: User): firestore.DocumentData {
return {
email: user.email,
name: user.name,
organization: user.organization ? user.organization.reference : null,
number_of_forwards: user.numberOfForwards,
last_forward_reset: user.lastForwardReset?.toDate()
}
}
fromFirestore(snapshot: firestore.QueryDocumentSnapshot): User {
const data = snapshot.data()!
return {
reference: snapshot.ref,
email: data.email,
name: data.name,
organization: data.organization ? { reference: data.organization } : null,
numberOfForwards: data.number_of_forwards,
lastForwardReset: moment(data.last_forward_reset.toDate())
}
}
}
export const resetNumberOfForwards = functions.pubsub
.schedule('every 15 minutes')
.onRun(async () => {
const reset = (user: User) => {
console.log(`Resetting ${user.email} from [${user.numberOfForwards}] to [0]`)
// Claim user reference
user.reference
?.withConverter(userConverter)
.set({ numberOfForwards: 0, lastForwardReset: Moment() }, { merge: true })
}
为了使部分集合起作用,我在文件顶部包含了以下代码片段。
firebase.firestore().settings({
ignoreUndefinedProperties: true
})