mongoose:删除子文档的内容

时间:2016-06-09 10:00:53

标签: javascript node.js mongodb mongoose

我有一个带有子文档的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 }

这是一个错误还是一个根本的误解?

1 个答案:

答案 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()