You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:54:00