Tengo una función programada que restablece un valor entero a cero en mi tienda de fuego. El problema con el que me estoy encontrando es que, si bien el conjunto de combinación tiene éxito (para las propiedades especificadas), de alguna manera restablece la referencia del documento de mi Organization a nulo.
Hasta ahora he probado lo siguiente
Update() (en lugar de Set() ). Si bien esto funciona, no está tipificado, y tengo que deshacerme del convertidor que encapsula la conversión moment() to Date.Set() y simplemente pase el objeto completo. user.reference?.withConverter(userConverter).set(user)Esto también funciona, pero anula todo el objeto del usuario y puede provocar problemas de simultaneidad en caso de que un usuario también actualice su objeto mientras se ejecuta la función cronometrada.
Estoy buscando una solución que me permita usar la clase de convertidor junto con un merge Set() .
La interfaz User se ve así
export interface User extends Document { email?: string name?: string organization?: Organization | null numberOfForwards?: number lastForwardReset?: moment.Moment }con su convertidor asi
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 }) }para que funcione el conjunto parcial, he incluido el siguiente fragmento en la parte superior de mi archivo
firebase.firestore().settings({ ignoreUndefinedProperties: true })