Mongoose嵌套Schema查询:去除日志_id并将日期转为本地格式
问题原因说明
- 嵌套子Schema默认自动生成
_id字段:Mongoose 中所有子Schema默认会自动添加_id属性,这是log数组每条数据多了_id的原因。 - Date类型默认序列化为ISO格式:MongoDB存储的Date类型字段,查询后默认会转为ISO标准时间字符串,和你需要的本地日期格式不符。
解决方案
第一步:修改ExerciseSchema关闭自动生成_id
在定义子Schema的时候添加{ _id: false }配置项,禁止子文档自动生成_id:
const exerciseSchema = new Schema({ description: String, duration: Number, date: Date }, { _id: false }); // 新增这行配置,关闭子文档_id自动生成 const Exercise = mongoose.model("Exercise", exerciseSchema); const userSchema = new Schema({ username: { type: String, unique: true }, logs: [exerciseSchema] }); const User = mongoose.model("User", userSchema);
第二步:修改接口代码格式化date字段
返回数据前遍历logs数组,用JS原生toDateString()方法将Date对象转为你需要的星期+月+日+年格式:
app.get("/api/users/:_id/logs", (req, res) => { const _id = req.params._id; User.findById(_id, (err, data) => { if (err) return res.status(500).json({ error: err.message }); // 补充错误处理 const count = data.logs.length; res.json({ username: data.username, _id: data._id, count: count, log: data.logs.map(item => ({ description: item.description, duration: item.duration, date: new Date(item.date).toDateString() // 格式化日期 })) }) }) })
如果不想修改Schema定义,也可以在map遍历的时候直接删除_id字段,写法如下:
log: data.logs.map(item => { const logItem = item.toObject(); delete logItem._id; logItem.date = new Date(logItem.date).toDateString(); return logItem; })
内容的提问来源于stack exchange,提问作者Imangi
相关产品推荐
相关产品推荐

