如何在MongoDB(Mongoose ODM)中删除文档多个字段而不删除整个文档
返回结果含义说明
你执行的更新语句本身语法合法,返回字段的含义如下:
ok: 1代表MongoDB服务端已正常接收并执行了请求,语句没有语法错误n: 0代表没有匹配到符合{_id: id}条件的文档,这是更新未生效的核心原因nModified: 0代表没有任何文档被修改
你选用的$unset操作符是完全正确的,它就是MongoDB专门用于删除文档指定字段的操作,不会删除整个文档,完全符合你的需求,问题出在查询条件的匹配环节。
解决方案
- 排查_id匹配问题
绝大多数匹配失败都是_id类型不匹配导致:MongoDB默认的_id字段是ObjectId类型,如果你传入的id是字符串格式,需要先转换类型再查询:
// Mongoose 环境下类型转换示例 const validId = mongoose.Types.ObjectId(id);
如果你是自定义的字符串类型_id(比如你示例中的"12345678"),请确认传入的id值和数据库中存储的完全一致,无多余空格、大小写偏差。
你可以先执行以下查询确认文档是否存在:
const existDoc = await UserModel.findOne({_id: validId}); console.log(existDoc); // 有输出代表匹配成功
- 执行字段删除操作
确认文档存在后,执行更新操作即可,$unset的右值可以填任意值(1、空字符串都可以,不影响执行逻辑):
const updateRes = await UserModel.updateOne( {_id: validId}, {$unset: {email: 1, firstName: 1}} );
执行后的返回结果说明:
n: 1, nModified: 1:匹配到文档且成功删除指定字段n: 1, nModified: 0:匹配到文档,但文档本身已经不存在你要删除的字段,无需修改n: 0:仍未匹配到文档,请再次核对id的取值和类型
内容的提问来源于stack exchange,提问作者Mhd
相关产品推荐
相关产品推荐

