Modelo:
const fooSchema = new mongoose.Schema({ fooCreationDate: { type: Date }, bar: [{ barCreationDate: { type: Date } }] }); const foo = mongoose.model(`foo`, fooSchema);Si queremos buscar objetos foo que se crearon entre 2022-01-01 y 2022-01-02, podemos usar la siguiente consulta de mangosta:
foo.find({ fooCreationDate: { $gte: "2022-01-01T00:00:00.000", $lt: "2022-01-02T00:00:00.000" } }); Tenga en cuenta que estoy usando cadenas en lugar de objetos de fecha. El motivo es que el cliente pasa la consulta a través de una llamada AJAX con dataType: "jsonp" . Cada objeto de fecha que se pasa así al backend se convierte automáticamente en una cadena ISO. A pesar de eso, la consulta funciona sin problemas: la función de búsqueda analiza automáticamente las fechas representadas como cadenas ISO.
Ahora nos gustaría extraer todos los objetos de barra que se crearon en el mismo rango de tiempo, por lo que necesitaremos usar una agregación:
foo.aggregate([{ $unwind: `$bar`, }, { $match: { "bar.barCreationDate": { $gte: "2022-01-01T00:00:00.000", $lt: "2022-01-02T00:00:00.000" } } }]);Desafortunadamente, no se encuentra nada a pesar de que la base de datos contiene objetos de barra coincidentes. Esto se puede confirmar pasando objetos de fecha en lugar de cadenas a la agregación de $coincidencia:
foo.aggregate([{ $unwind: `$bar`, }, { $match: { "bar.barCreationDate": { $gte: new Date("2022-01-01T00:00:00.000"), $lt: new Date("2022-01-02T00:00:00.000") } } }]);Esta consulta devuelve algunos resultados, por lo que la conclusión es que mongoose acepta cadenas de fecha ISO en la función de búsqueda, pero no puede manejarlas en la función de agregado. ¿Hay alguna solución conocida? Podría, por ejemplo, escanear en profundidad cada objeto de consulta pasado por el cliente y buscar cadenas de fecha ISO, luego convertirlas en objetos de fecha, pero eso es un poco sucio en mi opinión. Estoy usando mongoose v5.6.4 y mongodb v4.2.2.