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
相关产品推荐
相关产品推荐

