Tengo la fecha de transacción en la base de datos mongodb en el formato "7/1/2021 12:30:48 PM" (cadena en M/D/YYYY). Desde el lado de React, estoy ingresando dos fechas: desde la fecha y hasta la fecha, que son cadenas en el formato AAAA-MM-DD. Estoy usando el siguiente código para encontrar transacciones que vienen entre las fechas Desde y Hasta. Recibo un error de conversión, pero todas las fechas están en formato de cadena. Funciona perfectamente con una sola fecha sin $gte y $lte.
Mensaje de ERROR: CastError: la conversión a cadena falló para el valor "{ '$regex': '7/1/2021', '$options': '$i' }" (tipo Objeto) en la ruta "Trandate" para el modelo "transacción "
const chooseWinner = await Transaction.find( { ContCode: CountryCode, CurrCode: CurrCode, CorrOrgCode: CorrorgCode, ServCode: ServCode, BranchCode: BranchCode, Trandate: {$gte: {$regex : SDate, $options: "$i"}}, Trandate: {$lte: {$regex : EDate, $options: "$i"}}, }, "CustomerCode ReferenceNo Trandate " );También he cambiado las fechas desde y hasta al siguiente formato:
var SDate = new Date(FromDate).toLocaleDateString("hi-IN",{month:'numeric'})+"/"+ new Date(FromDate).toLocaleDateString("hi-IN",{day:'numeric'})+"/"+ new Date(FromDate).toLocaleDateString("hi-IN",{year:'numeric'}); console.log("frmdate: ",SDate); var EDate = new Date(ToDate).toLocaleDateString("hi-IN",{month:'numeric'})+"/"+ new Date(ToDate).toLocaleDateString("hi-IN",{day:'numeric'})+"/"+ new Date(ToDate).toLocaleDateString("hi-IN",{year:'numeric'}); console.log("enddate: ",EDate);No sé acerca de la expresión regular y $ gte / $ lte juntos, pero parece que el problema es con el formato de fecha. ¿Por qué no usar usar calumniado?
{Trandate:{$gte:ISODate(FromDate),$lt:ISODate(ToDate)}}
Para responder a la pregunta formulada directamente, no, el operador de consulta $regex no se puede anidar dentro de un operador de desigualdad como ese.
El operador $regex devuelve verdadero o falso para indicar si la cadena coincide o no, por lo que incluso si estuviera permitido, esa comparación anidada sería efectivamente "menor o igual que (booleano)". Dado que los operadores de consulta de mongodb son sensibles al tipo, esa comparación siempre será falsa.
Para responder a la pregunta implícita ¿ Cómo puedo consultar estas fechas por un rango específico? :
Las fechas almacenadas en el formato de cadena que muestra no se pueden comparar significativamente con las operaciones de desigualdad.
Por ejemplo, aquí hay algunas fechas ordenadas:
"6/1/2022 1:30 PM", "7/1/2021 12:30:48 PM", "7/1/2021 9:30:48 AM", "7/12/2021 12:30:48 PM", "7/2/2021 12:30:48 PM", "8/1/2001 8:55:00 AM" Si consultara {$lte: "8/1/2001 8:55:00 AM"} , las 6 fechas coincidirían.
Para consultar un rango de fechas, deberá:
$dateFromString para convertir las cadenas en fechas y luego haga coincidir el campo convertido. Esto no es escalable y no funcionará bien bajo ninguna carga no trivial.$gte y $lte directamente, y permitirá que se utilice un índice para mejorar el rendimiento.