我有一个带有子文档的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
的内容仍然存在 - 当我再次检索文档时,可以通过上面的示例代码看到这一点。
数据库中的文档显示为:
{ subdocument: { property1: 'test' }, __v: 0, _id: 57593a8130f2f7b6a12886b1 }
这是一个错误还是一个根本的误解?
答案 0 :(得分:2)
我相信架构中的常规JS对象属性由Mongoose提供Mixed
架构类型。
对于这些类型的属性,如果它们发生变化,您需要在保存之前明确告知Mongoose有关此更改:
/rpc-reply/blah/blah-blah/information/package-information[name='package 3']/comment
"更新了文档"将不反映文档存储在数据库中,只显示它在内存中的表示方式(它只是对doc.subdocument = {};
doc.markModified('subdocument');
doc.save(...);
对象的另一个引用)。
作为doc
的替代方法,您还可以使用findByIdAndUpdate()
,其附加优势是可以使用{{1}返回更新的(存储在数据库中)文档选项:
.save()