Guardé la fecha como una cadena en el esquema de ejercicio que se guardó como una matriz en el esquema del usuario. y mi esquema de la siguiente manera.
const exerciseSchema = new Schema({ description: String, duration: Number, date: String }); const Exercise = mongoose.model("Exercise", exerciseSchema); const userSchema = new Schema({ username: { type: String, unique: true }, log: [exerciseSchema] }); const User = mongoose.model("User", userSchema);Necesito llamar a sus datos, de acuerdo con las consultas que uso para ordenar por fechas. y lo he hecho de la siguiente manera.
app.get("/api/users/:_id/logs", (request, response) => { let _id = request.params._id; let query = request.query; User.findById(_id, (error, result) => { if(!error){ let responseObject = result if(query.from || query.to){ let fromDate = new Date(0) let toDate = new Date() if(query.from){ fromDate = new Date(query.from) } if(request.query.to){ toDate = new Date(query.to) } fromDate = fromDate.getTime() toDate = toDate.getTime() responseObject.log = responseObject.log.filter((session) => { let sessionDate = new Date(session.date).getTime() return sessionDate >= fromDate && sessionDate <= toDate }) } if(query.limit){ responseObject.log = responseObject.log.slice(0, query.limit) } responseObject = responseObject.toJSON() responseObject['count'] = result.log.length response.json(responseObject) } }) });Lo único que debo seguir es que no puedo obtener la fecha en formato local. la fecha se guarda en formato ISO (2015-12-15). Necesito llamarlo en formato local. pero aquí no tengo acceso a los objetos de la matriz de registros. No tengo ni idea de porqué.??
No almacene sus fechas como cadenas. Almacene sus fechas como fechas de Mongo ( ISODate("2020-12-24T05:00:00.000Z") ). Entonces puede consultar Mongo por fecha directamente. Transforma tus fechas después en el formato que quieras.
Ahora Mangosta es raro. De forma predeterminada, devuelve una matriz de objetos Mongoose, que son inmutables y difíciles de trabajar. Si solo necesita datos JSON puros, agregue la opción { lean : true } o .lean() si trabaja con la sintaxis encadenable (como se muestra a continuación).
app.get("/api/users/:_id/logs", async (request, response) => { let _id = request.params._id; let query = request.query; let user; try { user = await User .findById(_id) .populate("log") .lean() // Returns JSON, not immutable Mongoose objects .exec(); // Returns a Promise so you can 'await' it } catch (error) { response.json(error); // catch your errors return; } if (query.from || query.to) { let fromDate = new Date(0) let toDate = new Date() if (query.from) { fromDate = new Date(query.from) } if (request.query.to) { toDate = new Date(query.to) } const fromDateN = fromDate.getTime() const toDateN = toDate.getTime() user.log = user.log.filter((session) => { let sessionDate = new Date(session.date).getTime(); return sessionDate >= fromDateN && sessionDate <= toDateN; }) } if (query.limit) { user.log = user.log.slice(0, query.limit) } // user = user.toJSON() --> It's already JSON now. user['count'] = user.log.length response.json(user) });