2016-06-09 6 views
1

내가 하위 문서로 스키마를 (현재 버전 사용) 몽구스 있습니다몽구스 : 제거 하위 문서의 내용

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

가 지금은 기존 문서를 업데이트하는 등 doc.subdocument = {}를 사용하여 같은 subdocument을 제거하기 위해 노력하고있어 :

예상대로 doc.save에서
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(); 
    }); 
    }); 
}); 

콜백 가 subdocument: null로 문서를 반환, 그래서 가정, 업데이트가했다. 그러나 데이터베이스를 검사 할 때 subdocument의 내용은 그대로 있습니다. 위의 샘플 코드에서 문서를 다시 검색 할 때이 내용을 볼 수 있습니다.

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

는이 버그의 근본적인 오해 :

DB를의 문서로 본다?

답변

2

스키마의 일반 JS 개체 속성은 Mongoose에 의해 Mixed 스키마 유형이 부여됩니다. 그들이 변경하는 경우 속성의 이러한 유형의

, 당신은 명시 적으로 저장하기 전에 그 변화를 몽구스 말할 필요 : 그것이에 저장된으로

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

은 "업데이트 된 문서가"문서를 반영하지것 데이터베이스, 메모리에 표현 된 방법 만 (doc 개체에 대한 또 다른 참조).

.save()에 대한 대안, 당신은 또한 당신이는 new 옵션을 사용하여 업데이트 (저장 - 인 - 더 - 데이터베이스) 문서를 반환 할 수있는 추가 이점, findByIdAndUpdate()을 사용할 수 있습니다으로 :

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 편집을 참조하십시오. 유용 할 수도있는 '저장'대안을 추가했습니다. – robertklep

관련 문제