Digamos que estoy agregando algunos datos a Cloud Firestore:
import { collection, addDoc, serverTimestamp } from 'firebase/firestore'; const ref = await addDoc(collection(db, 'posts'), { createdAt: serverTimestamp(), modifiedAt: null, title: 'A Title', }); Tengo reglas que exigen que createdAt igual a request.time y nunca se actualice, modifiedAt debe ser null en la creación pero igual a request.time en la actualización, y el title debe ser una cadena.
El problema surge cuando trato de actualizar este documento:
import { doc, updateDoc } from 'firebase/firestore'; await updateDoc(ref, { createdAt: ???, // what goes here? modifiedAt: serverTimestamp(), title: 'A Title', }); Necesito createdAt para que sea el valor inicial de la marca de tiempo del servidor (como un objeto de Date ). No puedo simplemente poner serverTimestamp() porque Firestore intentará actualizar ese campo al nuevo valor de request.time y la aplicación de la regla fallará. No puedo hacer una actualización parcial (omitiendo createdAt ) porque estoy usando un ORM del lado del cliente (Ember Data), que no es capaz de manejar actualizaciones parciales como esta.
¿Hay alguna manera de recuperar el valor inicial de la serverTimestamp de tiempo del servidor después de llamar a addDoc , sin realizar una segunda solicitud inmediatamente después de addDoc para recuperar el documento que acabamos de crear? Parece innecesario hacer esa segunda solicitud, ya que ya tengo todos los datos (sin los valores de marca de tiempo). Básicamente, solo intento evitar agregar una segunda solicitud en toda la aplicación cada vez que se crea un nuevo registro.
Una operación updateDoc (a diferencia de una operación addDoc o la operación setDoc predeterminada) solo sobrescribirá las claves que realmente especifique. Entonces, para dejar createdAt tal como está, simplemente omítalo.
await updateDoc(ref, { modifiedAt: serverTimestamp(), title: 'A Title', }); Para extraer la clave de su CRM, use delete en la clave.
const dataToUpdate = { createdAt: "somevalue", modifiedAt: serverTimestamp(), title: 'A Title' } delete dateToUpdate.createdAt; await updateDoc(ref, dataToUpdate); Además, agregar un getDoc inmediatamente después no es tan costoso como cree. Si su aplicación usa ese documento en cualquier parte de su aplicación (ya sea escuchando el documento en sí o su colección principal), su aplicación cliente recibirá una notificación y se le proporcionarán los datos actualizados para almacenarlos en su caché local, independientemente de si los necesita inmediatamente después de agregarlos. .
const ref = await addDoc(collection(db, 'posts'), { createdAt: serverTimestamp(), modifiedAt: null, title: 'A Title', }); const snapshotWithServerTimestamps = await getDoc(ref);