gpt4 book ai didi

javascript - Mongoose :删除子文档内容

转载 作者:行者123 更新时间:2023-11-30 16:01:11 26 4
gpt4 key购买 nike

我有一个带有子文档的 Mongoose(使用当前版本)架构:

var mySchema = new Schema({
subdocument: { property1: { type: String } }
});
var myModel = mongoose.model('My-Model', mySchema);

现在我正在尝试更新现有文档并删除 subdocument,就像这样使用 doc.subdocument = {}:

new myModel({ name: 'test', subdocument: { property1: 'test' }}).save(function(err, doc) {
console.log('saved doc:\n', doc);
doc.subdocument = {}; // remove content of subdocument
doc.save(function(err, doc) {
console.log('updated doc:\n', doc); // subdocument: null
myModel.findById(doc._id, function(err, doc) {
console.log('retrieved doc:\n', doc); // subdocument: { property1: 'test' }
mongoose.disconnect();
});
});
});

doc.save 中的回调返回带有 subdocument: null 的文档,因此我假设更新按预期进行。然而,当检查数据库时,子文档的内容仍然存在——这可以在我再次检索文档时通过上面的示例代码看到。

数据库中的文档如下所示:

{ subdocument: { property1: 'test' }, __v: 0, _id: 57593a8130f2f7b6a12886b1 }

这是错误还是根本性的误解?

最佳答案

我相信模式中的常规 JS 对象属性被赋予了 Mixed Mongoose 的模式类型。

对于这些类型的属性,如果它们发生变化,您需要在保存之前明确地告诉 Mongoose 该变化:

doc.subdocument = {};
doc.markModified('subdocument');
doc.save(...);

“更新后的文档”不会反射(reflect)存储在数据库中的文档,只会反射(reflect)它在内存中的表示方式(它只是对 doc 对象的另一个引用) .

作为 .save() 的替代方法,您还可以使用 findByIdAndUpdate() ,还有一个额外的好处,您可以使用 new 选项让它返回更新的(存储在数据库中的)文档:

myModel.findByIdAndUpdate(doc._id, {
$set : { subdocument : {} }
}, { new : true }, function(err, doc) {
// `doc` will now reflect what's stored in the database
});

关于javascript - Mongoose :删除子文档内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com