2013-07-30 2 views
1

schema.pre('save', function(){...}); 유효성 검사를 만들었지 만 업데이트로 인해 트리거되지 않았습니다. 업데이트에 대한 유효성 검사를 원했기 때문에 다음과 같이 시작했습니다.Mongoosejs가 유효성 검사를 위해 설정/저장되었습니다.

MySchema.findOne({...}, function(doc) { 
    doc.set(req.body); 
    doc.save(function(){...}); 
}); 

이렇게하는 데 단점이 있습니까? 그것은 논리적 인 것 같습니다. 그러나 나는 doc.update({}); 또는 MySchema.findXxxAndUpdate({},{})으로 완료 한 것을 본 것만큼이나이 방법으로 업데이트를 보지 못했습니다. update은 모든 것을 네이티브 드라이버에 전달하므로 설정/저장시 성능이 저하 될 수 있습니다. 원 자성은 어떻습니까?

답변

1

findOne 호출과 doc.save 호출 사이에 다른 업데이트가 발생할 수 있으므로 업데이트의 주된 단점은 업데이트의 기본 성을 잃는 것입니다.

코드로 구현해야하는 테스트 된 논리를 제공하는 $addToSet과 같은 다양한 업데이트 연산자의 기능도 손실됩니다.

+0

몽구스는 각'save' 연산을 원자 적'update' 연산으로 래핑합니다. 또한 문서를 덮어 쓰지 않도록 빌드 인 버전을 지원합니다. –

+0

@LeonidBeschastny [이 문서] (http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning)에 따르면 버전 관리는 포함 된 배열 속성을 업데이트 할 때만 사용되지만 매우 문서화되지 않았습니다 그럼 당신은 그것이 그 이상을한다는 것이 옳을 수도 있습니다. 그럼에도 불구하고 지저분한 세이브 케이스를 처리하는 코드를 추가해야합니다. – JohnnyHK

+0

귀하의 링크에서 알 수 있듯이 몽구스 버전은 요소의 절대 위치를 변경할 수있는 모든 배열 연산을 보호합니다. 'mongoose'가 mongoidb'save' 메소드를 호출하기 때문에 다른 모든 업데이트 연산은 getters, validators, hooks를 제외하고는'save'와'findOneAndUpdate'와 동일하게 동작해야합니다. db에서 전체 문서를 가져오고, 단일 필드를 업데이트하고 저장하면이 필드에서만 원자 적으로 'update' 연산이 수행됩니다. –

관련 문제