2016-06-09 144 views
1

我有一个猫鼬(使用当前版本)架构与子文档:猫鼬:删除子文档的内容

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的内容仍然存在 - 当我再次检索文档时,可以通过上面的示例代码看到这一点。

在DB文件看起来:

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

这是一个错误或一个根本性的误解?

回答

2

我相信模式中的常规JS对象属性由Mongoose给出Mixed模式类型。

对于这些类型的属性,如果他们改变,你需要在保存前需要明确地告诉猫鼬有关的变化:

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

的“更新文档”,因为它是存储在将反映文档数据库,它只是它在内存中的表示方式(它仅仅是对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 
}); 
+0

谢谢你,'markModified'完成了这个诀窍!尤其要感谢返回的“doc”文档的注释。直到现在,我还是天真地认为这是存储在数据库中的文档,所以我必须仔细阅读我的代码。 – qqilihq

+1

@qqilihq看到我的编辑,我添加了一个'save'的替代方案,可能也很有用。 – robertklep