programing

.save()와 update()의 Mongoose 차이

batch 2023. 3. 17. 19:42
반응형

.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전체 문서를 로드하지 않기 때문입니다.
  • 몽구스updateMongoDB로 변환됩니다.update하지만 몽구스saveMongoDB 중 하나로 변환됩니다.insert(새로운 문서의 경우) 또는update.
  • 이 점에 주의하는 것이 중요합니다.saveMongoose는 문서를 내부적으로 구분하여 실제로 변경된 필드만 전송합니다.이것은 원자력에 좋다.
  • 기본적으로 유효성 검사는 다음 날짜에 실행되지 않습니다.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

반응형