Tengo una aplicación que mantiene una copia completa de los datos del usuario de forma local, pero necesita actualizaciones de Firestore cuando se modifica algún dato de forma remota. Para lograr esto, incluyo un serverTimestamp como un campo para todos los documentos de la base de datos, así:
updateDoc(myDoc, { ...otherFields, lastUpdated: serverTimestamp() });Y luego tengo un oyente de instantáneas para obtener actualizaciones. Verifico la marca de tiempo en cada documento y guardo el más reciente para consultas futuras (si lastTimestamp es nulo, consulto todos los documentos).
let q = query(myCollection, where("lastUpdated", ">", lastTimestamp)); onSnapshot(q, (s) => s.docChanges().forEach((change) => { /*...*/ if(lastTimestamp.valueOf() < change.doc.data().lastUpdated.valueOf()) { lastTimestamp = change.doc.data().lastUpdated; } }); El problema es que mi consulta no parece funcionar: la instantánea no se activa en las actualizaciones. Aparentemente, mi where("lastUpdated", ">", lastTimestamp) no se procesa correctamente, ya que funciona bien si lo dejo fuera (para consultar todos los documentos, no es una solución permanente). ¿Existe una forma correcta de consultar documentos en función de un campo de marca de tiempo del servidor que me falta?
El problema, en mi caso, fue que guardé lastUpdated en localStorage y lo cargué, despojándolo de su información de tipo. Entonces, crear una instancia de una marca de tiempo ( import { Timestamp } from "firebase/firestore" ) resolvió el problema para mí:
const ts = lastUpdatedFromLocalStorage; if(ts) lastUpdated = new Timestamp(ts.seconds, ts.milliseconds); else lastUpdated = null;