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

Node.js环境下使用Mongoose操作MongoDB如何删除对象的_id属性

问题根因
  • 语法错误:你写的delete newdoc_id是错误写法,目标属性_id属于newdoc对象,正确语法应为delete newdoc._id,但该操作对Mongoose文档实例无效。
  • Mongoose文档特性:你通过Templates构造函数传入查询到的旧文档时,旧文档自带的_id会被直接赋值到新实例上,且Mongoose封装的文档实例属性无法通过普通delete操作删除。
可行解决方案

方案1:查询阶段直接排除_id字段(最便捷)

查询TemplateInfo时通过投影参数直接排除_id,从源头避免旧_id被带入新文档:

TemplateInfo.find(req.query, { _id: 0 }).exec(function (err, doc) {
  if (err) throw err; // 按需补充错误处理逻辑
  var newdoc = new Templates(doc[0]);
  newdoc.save(function(err, savedDoc) {
    console.log("新文档已生成,自动生成的_id为:", savedDoc._id);
  });
});

方案2:转普通JS对象后删除旧_id

先把查询到的Mongoose文档转为普通JS对象,删除_id后再实例化新文档:

TemplateInfo.find(req.query).exec(function (err, doc) {
  if (err) throw err;
  // 转为普通JS对象,解除Mongoose封装
  var rawOldDoc = doc[0].toObject();
  // 此时可以正常删除_id属性
  delete rawOldDoc._id;
  var newdoc = new Templates(rawOldDoc);
  newdoc.save();
  console.log("new doc", newdoc);
});

方案3:实例化后通过Mongoose API修改_id

如果已经完成新文档实例化,可以用Mongoose内置的set方法覆盖_id:

var newdoc = new Templates(doc[0]);
// 把_id设为undefined,Mongoose会自动生成新的_id
newdoc.set('_id', undefined);
newdoc.save();
注意事项
  • 确认Templates集合的Schema没有配置_id: false,默认情况下Mongoose会为所有新文档自动生成_id字段。
  • 不要直接对Mongoose文档实例执行普通属性删除操作,该操作只会删除JS对象层的属性,不会修改Mongoose内部维护的文档数据。

内容的提问来源于stack exchange,提问作者Jerry Seigle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:27:01