在Mongoose中,如果您从一个文档中删除一个嵌入式文档,则默认情况下,该操作将自动持久化到数据库中。这意味着您可能没有机会检查要删除的文档是否满足某些条件。
为了避免这种情况,您可以将autopopulate: false
选项添加到嵌套对象中:
const ParentSchema = new mongoose.Schema({
embedded: {
child: {
type: mongoose.Schema.ObjectId,
ref: 'Child',
autopopulate: false // 添加该选项
}
}
});
ParentSchema.plugin(require('mongoose-autopopulate'));
const ChildSchema = new mongoose.Schema({
name: String
});
ChildSchema.plugin(require('mongoose-autopopulate'));
接下来,在要删除的文档上,使用.populate()
方法手动填充嵌套属性。然后,您可以使用.populate()
方法删除该文档,而不会自动持久化嵌套属性:
ParentModel.findById(parentId)
.populate({
path: 'embedded.child',
select: '_id'
})
.exec((err, doc) => {
if (err) {
// 处理错误
} else {
doc.embedded.child = null;
doc.save((err) => {
if (err) {
// 处理错误
} else {
// 文档已成功更新
}
});
}
});
请注意,您需要使用.populate()
方法加载嵌套属性,并选择只返回文档ID。然后,您可以将该属性设置为null
或从嵌套属性数组中删除它,并使用.save()
方法将文档保存回数据库中。
上一篇:避免从PDF中提取重复的图片
下一篇:避免从随机选择中出现重复