sql >> Base de Datos >  >> NoSQL >> MongoDB

La agregación de mangosta no filtra por fecha de entrada

Mongoose tiene "esquemas" para los cuales hace esta cosa mágica llamada "autocasting" por ti. El caso típico que los diseñadores tienen en mente aquí es que todas las entradas de interacciones "web" como GET y POST está básicamente contenido en una "cadena".

Ya sea que haya o no algún ayudante que convierta los parámetros en objetos con claves y valores, todos esos "valores" siguen siendo "cadenas", o posiblemente se conviertan directamente en numéricos por los mismos "ayudantes" cuando corresponda. Este es un diseño de marco web común.

Entonces, cuando emite un .find() , esta función es completamente incapaz de alterar el contenido devuelto que no sea por omisión de campos/propiedades, por lo que se aplica el "esquema".

El .aggregate() el método es totalmente diferente. Toda su existencia es para modificar contenidos contenidos en documentos y colecciones. La consecuencia de esto es que es "imposible" que se aplique un esquema.

Por lo tanto, el "autocasting" presente en métodos como .find() no sucede , y debe convertir elementos (como la "cadena" en la que se envía su "fecha") a los tipos correctos usted mismo:

Reservation.aggregate([
   { "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])

Incluso si todo lo que estás haciendo es un $match y que no ha "modificado" el esquema de ninguna manera, mongoose no "presume" esto y no intenta convertir al campo coincidente en el esquema.

La lógica aquí es que un $match etapa o cualquier cosa similar que podría vincularse a un "tipo", podría ocurrir en cualquier lugar dentro de la canalización. Como tal, no hay garantía de que los documentos sobre los que actúa una etapa de canalización tengan alguna semejanza con el esquema de recopilación original.

Podría decirse que "podría" posiblemente considere el hecho de que esto es la primera etapa de la tubería donde nada podría haber cambiado y hacer una inspección similar. Pero no es así como funcionaba el código base actual.

En resumen, cuando se usa la canalización de agregación, todos los objetos que deben convertirse específicamente en un tipo (Fecha, ObjectId, etc.) deben convertirse "manualmente" en su código, en lugar de asumir que Mongoose lo hará por usted. como en otros métodos.