.save()와 update()의 Mongoose 차이
mongoose에서 기존 엔트리의 필드를 수정하려면 를 사용하는 것과
model = new Model([...])
model.field = 'new value';
model.save();
그리고 이건
Model.update({[...]}, {$set: {field: 'new value'});
제가 이 질문을 하는 이유는 제가 어제 올린 문제에 대한 누군가의 제안 때문입니다.NodeJ 및 Mongo - 여러 사용자가 동시에 요청을 보낼 때 예기치 않은 동작이 발생합니다.그 사람이 저장 대신 업데이트를 사용하자고 제안했는데, 그게 왜 다른지 아직 잘 모르겠어요.
감사합니다!
두 가지 콘셉트 먼저.어플리케이션은 클라이언트, Mongodb는 서버입니다.
가장 큰 차이점은 와의 차이입니다..save()
클라이언트 측 코드에 이미 오브젝트가 있거나 데이터를 쓰기 전에 서버에서 데이터를 가져와 전체 데이터를 다시 씁니다.
반면에.update()
그럼 서버에서 클라이언트에 데이터를 로드할 필요가 없습니다.모든 대화는 클라이언트에 대한 검색 없이 서버 측에서 수행됩니다.그렇게.update()
기존 문서에 내용을 추가할 때 이 방법으로 매우 효율적일 수 있습니다.
또, 다음과 같은 것이 있습니다.multi
에 대한 파라미터.update()
쿼리 조건과 일치하는 둘 이상의 문서에서 작업을 수행할 수 있습니다.
편리한 방법에는 사용할 때 잃어버리는 것이 있습니다..update()
그러나 특정 운영의 이점은 사용자가 부담해야 하는 "트레이드오프"입니다.자세한 내용과 사용 가능한 옵션에 대해서는 설명서를 참조하십시오.
요컨대.save()
클라이언트측 인터페이스입니다..update()
는 서버측입니다.
몇 가지 차이점:
- 다른 곳에서 언급했듯이
update
보다 효율적입니다.find
이어서save
전체 문서를 로드하지 않기 때문입니다. - 몽구스
update
MongoDB로 변환됩니다.update
하지만 몽구스save
MongoDB 중 하나로 변환됩니다.insert
(새로운 문서의 경우) 또는update
. - 이 점에 주의하는 것이 중요합니다.
save
Mongoose는 문서를 내부적으로 구분하여 실제로 변경된 필드만 전송합니다.이것은 원자력에 좋다. - 기본적으로 유효성 검사는 다음 날짜에 실행되지 않습니다.
update
유효하게 할 수 있습니다. - 미들웨어 API(
pre
그리고.post
후크)는 다릅니다.
몽구스에는 미들웨어라고 불리는 유용한 기능이 있습니다.미들웨어에는 프리웨어와 포스트웨어가 있습니다.미들웨어는 '저장'을 하면 실행되지만 '업데이트' 중에는 실행되지 않습니다.예를 들어 패스워드가 변경될 때마다 사용자 스키마에서 패스워드를 해시하려면 다음과 같이 pre를 사용합니다.다른 유용한 예는 각 문서에 대해 lastModified를 설정하는 것입니다.매뉴얼은 http://mongoosejs.com/docs/middleware.html 에서 구할 수 있습니다.
UserSchema.pre('save', function(next) {
var user = this;
// only hash the password if it has been modified (or is new)
if (!user.isModified('password')) {
console.log('password not modified');
return next();
}
console.log('password modified');
// generate a salt
bcrypt.genSalt(10, function(err, salt) {
if (err) {
return next(err);
}
// hash the password along with our new salt
bcrypt.hash(user.password, salt, function(err, hash) {
if (err) {
return next(err);
}
// override the cleartext password with the hashed one
user.password = hash;
next();
});
});
});
가볍게 보아서는 안 되는 세부 사항: 동시성
설명한 바와 같이, '우리'를 할 때,doc.save()
문서를 으로 문서를 메모리에 로드한 다음 수정한 다음, 문서를 메모리에 로드하다, 수정하다,doc.save()
MongoDB mong mong mong 。
이 문제는 문서가 동시에 편집될 때 발생합니다.
- Person A가 문서를 로드합니다(v1).
- 개인 B가 문서를 로드합니다(v1).
- 개인 B는 문서에 변경 내용을 저장합니다(현재 v2).
- Person A는 오래된(v1) 문서에 변경 내용을 저장합니다.
- 개인 A는 컬렉션에서 마지막으로 로드된 이후 문서가 변경되었기 때문에 Mongoose가 VersionError를 발생시킵니다.
은 원자 을 할 때 .Model.updateOne()
조작은 MongoDB 서버에서만 이루어지기 때문에 어느 정도의 동시성 제어를 실행할 수 있습니다.
그러니 조심하세요!
언급URL : https://stackoverflow.com/questions/22278761/mongoose-difference-between-save-and-using-update
'programing' 카테고리의 다른 글
PHP 욕설 필터 (0) | 2023.03.17 |
---|---|
JSON의 문자열을 사용하여 10진수를 나타내는 이유는 무엇입니까? (0) | 2023.03.17 |
릴레이를 사용할 때 로컬 상태를 어떻게 처리합니까? (0) | 2023.03.17 |
Wordpress 사용자 지정 등록 양식 (0) | 2023.03.17 |
JSON 데이터를 javascript에 구문 분석 없이 동기적으로 포함하려면 어떻게 해야 합니까? (0) | 2023.03.17 |