为何Mongoose数据中currentEmployment对象被整体删除?
问题原因分析
当你执行data.currentEmployment['Police'] = undefined后,整个currentEmployment对象消失,核心原因有两点:
Mongoose对
undefined的处理逻辑
Mongoose不会保存值为undefined的属性。当你给currentEmployment['Police']赋值undefined时,Mongoose会直接将这个属性从currentEmployment对象中移除,而非保留一个undefined的键值对。此时currentEmployment就变成了空对象{}。Mongoose默认的
minimize配置
Mongoose默认开启minimize: true选项,这个配置会自动从文档中移除空的对象类型字段(即没有任何键的对象)。所以当currentEmployment变成空对象后,在保存时就会被整个从文档中删除。
正确的解决方法
方法1:使用delete操作符删除属性(可选保留空对象)
如果需要删除Police子对象后保留空的currentEmployment,先修改Schema关闭minimize:
const Schema = new mongoose.Schema({ userId: { type: String, required: true, unique: true }, currentEmployment: { type: Object, default: {} }, // 设置默认空对象 employmentHistory: [ { department: { type: String }, lastPosition: { type: String }, joinDate: { type: Number }, leaveDate: { type: Number }, punishmentHistory: [ { type: { type: String }, reason: { type: String }, date: { type: Number } } ] } ], }, { minimize: false }); // 关闭空对象自动移除
再执行删除操作:
delete data.currentEmployment['Police']; await data.save();
此时currentEmployment会以空对象的形式保留在文档中。
方法2:使用$unset直接更新数据库(更高效)
不需要先查询文档,直接用MongoDB的$unset操作符在数据库层面修改,这是更推荐的方式:
await YourModel.updateOne( { _id: data._id }, { $unset: { 'currentEmployment.Police': 1 } } );
如果删除后currentEmployment为空,Mongoose依然会因为默认的minimize: true将其移除;若想避免,同样需要在Schema中添加{ minimize: false }配置。
内容的提问来源于stack exchange,提问作者779804
相关产品推荐
相关产品推荐

