Configuré por error un campo de fecha como una cadena al crear la base de datos de la que no me di cuenta y ahora los documentos en la base de datos realmente han aumentado, por lo que almacena el número de fecha como una cadena en la base de datos de Firestore y quiero hacer una consulta donde comparo si la fecha está entre la fecha de inicio y finalización que proporcioné. ¿Puede alguien ayudarme?
así es como lo almacené en el documento
date: Date.now().toString()y las variables para la fecha de inicio y la fecha de finalización
startDate = new Date(new Date().getFullYear(), new Date().getMonth(), 1); endDate = new Date( new Date().getFullYear(), new Date().getMonth() + 1, 0 ).setHours(23, 59, 59, 999);y esta es la consulta
return this.firestore .collection('orders', (orders) => orders .where('date', '>=', this.startDate) .where('date', '<=', this.endDate) .orderBy('date', 'desc') )esto no funciona, ¿hay alguna forma de evitarlo? o tengo que reestructurar la base de datos de nuevo?
Almacenar una fecha en la que desea consultar de esta manera es una mala idea y un antipatrón común:
date: Date.now().toString() El formato que obtiene al llamar a toString() ( "Wed Oct 05 2011 07:48:00 GMT-0700 (Mountain Standard Time)" ) está diseñado para mostrarse a humanos y no es adecuado para ordenar y filtrar por código.
Debe almacenar sus valores como Firestore Timestamp o como un formato de cadena que se puede ordenar y filtrar.
El almacenamiento de fechas como una Timestamp de tiempo se puede lograr con:
date: Date.now() Con esto, Firestore almacenará el valor como una Timestamp de tiempo, que luego puede ordenar y filtrar con facilidad al pasar los objetos de Timestamp de tiempo o Date a las cláusulas where de su consulta.
El almacenamiento de fechas como una cadena ordenada lexicográficamente se puede lograr con:
date: Date.now().toISOString() Con esto, almacenará cadenas en un formato como "2011-10-05T14:48:00.000Z" , que se puede ordenar y usar para realizar consultas de rango.
Actualización : como señaló, su Date.now().toString() le proporciona una marca de tiempo numérica en formato de cadena, por ejemplo, "1657889475842" .
En ese caso, el problema es que está pasando objetos de Date en la consulta, y comparar una fecha con una cadena nunca dará una coincidencia. También debe pasar números como cadenas a where también, o tomar el enfoque que recomendé anteriormente.
Lo arreglé. esta es la solucion
return this.firestore .collection('orders', (orders) => orders .where('date', '>=', this.startDate.getTime().toString()) .where('date', '<=', this.endDate.toString()) ) .valueChanges({ idField: 'Id' });