<p>mongoose 4.0.1: ์‚ฌ์ „ "์—…๋ฐ์ดํŠธ" ๋ฏธ๋“ค์›จ์–ด ์ด ๊ฐœ์ฒด๋Š” ๋ชจ๋ธ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2015๋…„ 03์›” 30์ผ  ยท  40์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ์‹  ๋ฒ„์ „์˜ Mongoose์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Express์™€ Mongoose 4.0.1๋กœ API๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์‚ฌ์‹ค์€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด pre ์—…๋ฐ์ดํŠธ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค pre ์ €์žฅ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. this ๊ฐœ์ฒด๋Š” ์—…๋ฐ์ดํŠธ ์ค‘์ธ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  Query ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋ ค๋Š” ๊ฒƒ์˜ ์˜ˆ:

ExerciseSchema.pre('save', function (next, done) {
        var self = this;
        console.log('exercise:', self); // returns exercise object
        // some validations here
       next();
});
ExerciseSchema.pre('update', function (next, done) {
        var self = this;
        console.log('exercise:', self); // returns Query object instead of exercise object
        // some validations here
       next();
});

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ฏธ๋“ค์›จ์–ด ๋‚ด์˜ this ์ฐธ์กฐ ๊ฐœ์ฒด์—์„œ ์–ป์€ ๊ฒƒ์ธ๋ฐ, ๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

{ _mongooseOptions: {},
  mongooseCollection: 
   { collection: { s: [Object] },
     opts: { bufferCommands: true, capped: false },
     name: 'exercises',
     conn: 
     ... },
   ...
}

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ทธ ์†์„ฑ ์ค‘ ์ผ๋ถ€๋Š” ./node_modules/mongoose/lib/query.js ์— ์ •์˜๋œ Query ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ์ฒด ์ €์žฅ์— ๋Œ€ํ•œ ๋ฏธ๋“ค์›จ์–ด ๋‚ด์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง์ ‘ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†”๋ฃจ์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

findOneAndUpdate pre ๋ฏธ๋“ค์›จ์–ด์—์„œ๋„ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ฐพ๊ธฐ ์ „์— ์šด๋™์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ทธ๋ฆฌ๊ณ  ์ œ ์†”์งํ•œ ์˜๊ฒฌ์œผ๋กœ๋Š” findAndUpdate์™€ findOneAndUpdate pre ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ž์ฒด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ  find(One)์™€ update ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ด ์ˆœ์„œ๋Œ€๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„์›€์„ ์ฃผ์…”์„œ ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

won't fix

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. update() findOneAndUpdate() ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ณ„๊ฐœ์˜ ํ›„ํฌ๊ฐ€ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์‚ฌ์ „ ํ›„ํฌ์—์„œ findOneAndUpdate ์— ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

schema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { $set: { key: 'value' } });
});

๋ชจ๋“  40 ๋Œ“๊ธ€

์˜๋„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฌธ์„œ๊ฐ€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชฝ๊ตฌ์Šค๋Š” update()๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด findOne()์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ์€ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜, ์˜ต์…˜ ๋“ฑ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ฟผ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด find() ๋ฐ findOne()์„ ์‚ฌ์šฉํ•˜์—ฌ .populate()๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ ํ•˜๊ณ  multi: true ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ์˜ต์…˜, ์•ก์„ธ์Šค ์ œ์–ด ๋ฐ ๊ธฐํƒ€ ๊ฐ€๋Šฅ์„ฑ .

findOneAndUpdate() ๋Š” ์•ฝ๊ฐ„ ์ž˜๋ชป๋œ ์ด๋ฆ„์ด๋ฉฐ ๊ธฐ๋ณธ mongodb findAndModify ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉฐ findOne() + update() ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ž‘์—…์œผ๋กœ ์ž์ฒด ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด '์‚ฌ์ „' ์—…๋ฐ์ดํŠธ ๋ฏธ๋“ค์›จ์–ด ์ค‘์— ๋ฌธ์„œ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

this.update({ field: val }); ๋Š” ์—…๋ฐ์ดํŠธ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— { $set: { field: val } } ๋ฅผ ์—…๋ฐ์ดํŠธ ์ž‘์—…์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๋ณ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? 4.0.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์—์„œ "exec"๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

this.update๋ฅผ ์‹คํ–‰ํ•˜๋ฉด http://mongoosejs.com/docs/api.html#query_Query -update ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„๊นŒ์š”?

๋‚˜๋Š” ๊ฒฐ๊ตญ this.findOneAndUpdate({matcher: "myvalue"}); ๊ทธ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ  4.0.2๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

๋ฐฉ๊ธˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

var schema = mongoose.Schema({
    name: String,
    description: String,
    matcher: String,

});

var generateMatcherUpdate= function(next) {
     var matcher = "generate matcher function"
        this.update({matcher: matcher});

    next();
};

 schema.pre('update', generateMatcherUpdate);

์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. update() findOneAndUpdate() ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ณ„๊ฐœ์˜ ํ›„ํฌ๊ฐ€ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์‚ฌ์ „ ํ›„ํฌ์—์„œ findOneAndUpdate ์— ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

schema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { $set: { key: 'value' } });
});

man mongoose ๋ฌธ์„œ๋Š” ๋ชน์‹œ ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ๊ฑฐ๊ธฐ์— ๋„ฃ์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@askdesigners ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๊นŒ?

๊ธ‰ํ•œ ๋งˆ์Œ์— ์ ์–ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค :)

๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์˜ ์ทจ์•ฝ์„ฑ. ๊ทธ๊ฒƒ์€ ๋ช…๋ฐฑํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ์ž…๋‹ˆ๋‹ค.

๊ฑฑ์ • ๋งˆ. ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  pre.update์—์„œ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”!

schema.pre('update', function() {
  var v = this.getUpdate().valueToSanitize;
  this.update({}, { $set: { valueToSanitize: sanitize(v) } });
});

์ข‹์•„์š”, ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!
๊ฐ์‚ฌ ํ•ด์š”!!

์•ˆ๋…•ํ•˜์„ธ์š” @vkarpov15 , ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์ด๊ฑฐ๋‚˜ ์ ์–ด๋„ ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ™์€ ์ผ์„ ํ•˜๋ฉด

MyModel.findOneAndUpdate({a: 1}, {v: '__3'}, function (err, model) {
    console.log(model);
});

๊ทธ๋ฆฌ๊ณ  ๋‚ด ๋ชจ๋ธ์—์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค

mySchema.pre('findOneAndUpdate', function() {
  var v = this.getUpdate().v;
  this.findOneAndUpdate({}, { $set: { v: sanitize(v) } });
});

ํ›„ํฌ ํ›„์— ์›๋ž˜ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ๋Š” '__3'์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํ‚ค๋งˆ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์›๋ž˜ ์ฟผ๋ฆฌ์—์„œ ์—…๋ฐ์ดํŠธ๋œ ๋ชจ๋“  ํ•„๋“œ๋Š” ํ”„๋ฆฌ ํ›„ํฌ์—์„œ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

@CMatias $set ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ชฝ๊ตฌ์Šค๋Š” $set ๋กœ ๋ž˜ํ•‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜๋“œ์‹œ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ this.findOneAndUpdate({}, { v: sanitize(v) });

@vkarpov15 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. $set ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ mongodb ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ  coll.findOneAndUpdate({ a: 1 }, { __v: 3 }) ํ•˜๋ฉด mongodb๋Š” a = 1์ธ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€ { __v: 3 } modulo _id ๋ฌธ์„œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด ๋ฌธ์„œ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ํ‚ค '__v'๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด coll.findOneAndUpdate({ a: 1 }, { $set: { __v: 3 } }) ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋™์ž‘์€ ํ•ญ์ƒ ๋…ผ๋ž€์ด ๋˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šฐ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ mongoose๋Š” ๋ฌธ์„œ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, $ overwrite: true ์˜ต์…˜์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ MyModel.findOneAndUpdate({ a: 1 }, { __v: 3 }) ๋Š” MyModel.collection.findOneAndUpdate({ a: 1 }, { $set: { __v: 3 } }) ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MyModel.update({}, { $set: { b: 2 } }).findOneAndUpdate({ a: 1 }, { __v: 3 }, { overwrite: true }) ์™€ ๊ฐ™์€ ์ด์ƒํ•œ ์ผ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ getUpdate() ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ update ์ƒํƒœ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด์šฉ.

์ด ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฏธ๋“ค์›จ์–ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ๊ธฐ์—์„œ ๋ฐ˜ํ™˜๋  ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ถ”๊ฐ€ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‘๋‹ต์„ "์žฅ์‹"ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํ‚ค๋งˆ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

const Thing = new mongoose.Schema({
  name: {type: String}
});

Thing.post('find', function(doc, next){
  doc.newfield = "example text";
  next();
}

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€?

newfield ๊ฐ€ ์Šคํ‚ค๋งˆ์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ด์œ ๋Š” Thing ์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•„๋“œ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

schema.pre('update')๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š” @jrogatis

@vkarpov15

์œ„์—์„œ ์ œ์‹œํ•œ ์˜ˆ๋ฅผ ๋ณด๋ฉด ...:

schema.pre('update', function() {
  var v = this.getUpdate().valueToSanitize;
  this.update({}, { $set: { valueToSanitize: sanitize(v) } });
});

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . this.getUpdate().value ์—๋Š” ์˜ˆ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด value ๋‚ด ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  this.getUpdate().$set.property ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ผญ ๊ทธ๋ž˜์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ์š”? ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? API๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‚˜์š”? ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@qqilihq ์žฌํ˜„ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@qqilihq nvm, ๋ฐฉ๊ธˆ ๋‹น์‹ ์ด ํ•œ ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค :P

@varunjayaraman ์‚ฌ์‹ค ์ œ๊ฐ€ ๋”ฐ๋กœ ์—ฐ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. :) ํ•˜์ง€๋งŒ ์˜ˆ์ œ๋ฅผ ์ปดํŒŒ์ผํ•  ์—ฌ์œ  ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด ๊ธฐ๊บผ์ด ์œ„์˜ ์ฃผ์„์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

@qqilihq ์•„, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@qqilihq ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

image

๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์›ํ•˜๋Š” ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

userSchema.pre('update', function (next) {
  const newEmail = this.getUpdate().$set.email
  if (newEmail) {
    this.update({}, {$set: {email: normalizeEmail(newEmail)}})
  }
  next()
})

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pre ๋ฉ”์†Œ๋“œ๋Š” this.update ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด "์‚ฌ์ „" ์ €์žฅ์ด๊ณ  ์•„์ง ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด this.newProp = "value" ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

UserSchema.pre('save', function(next) {
    this.created = Date.now()
    next()
})

"์‚ฌ์ „" ์—…๋ฐ์ดํŠธ ํ›„ํฌ์—์„œ ์ฟผ๋ฆฌ๋ฅผ "์ด๊ฒƒ"์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ "ํฌ์ŠคํŠธ" ์—…๋ฐ์ดํŠธ ํ›„ํฌ๊ฐ€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•  ๋•Œ ์‹ค์ œ ๋ชจ๋ธ์ด "์ด๊ฒƒ"์ด์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋ฉด post find๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด๋กœ this ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๊ฒŒ์‹œ๋ฌผ ์ฐพ๊ธฐ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋ชจ๋‘ ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. IMHO ์‚ฌ์ „ ํ›„ํฌ๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. this ๋Š” ์ˆ˜์ • ์ค‘์ธ ๊ฐœ์ฒด์ด๊ณ  isModified์™€ ๊ฐ™์€ ๋ฉ‹์ง„ ๋ฉ”์„œ๋“œ๋Š” ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด์ œ ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์•„์š”. ์‚ฌ์ „ '์ €์žฅ' ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ this.isNew ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@ajbraus ์กฐ๊ธˆ ์ด์ƒํ•˜์ง€๋งŒ ๋Œ€์•ˆ์€ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ ํ—ค๋“œ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” updateMany๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชฝ๊ตฌ์Šค๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ์ „์— ๋ฌธ์„œ ํ•„๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฌธ์„œ๋ฅผ "์œ ํšจ"๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ํ•„๋“œ๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์ค‘์ธ ํ•„๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ๋ฌธ์„œ์— ์–ด๋–ป๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? this ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

@PDS42 mongodb์—์„œ ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด ๋ณ„๋„์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชฝ๊ตฌ์Šค ๋ฌธ์„œ์— ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋” ์ž์„ธํžˆ ์„ค๋ช…๋œ ํŠน์ • ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  ์ด๊ฒƒ์„ ๋” ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :).

ํŽธ์ง‘ํ•˜๋‹ค:

์‚ฌ์ „ ์—…๋ฐ์ดํŠธ ํ›„ํฌ: https://github.com/Automattic/mongoose/issues/2812
๋ฏธ๋“ค์›จ์–ด: https://mongoosejs.com/docs/middleware.html
์ฟผ๋ฆฌ ๊ฐœ์ฒด: https://mongoosejs.com/docs/api.html#Query
์ฟผ๋ฆฌ: https://mongoosejs.com/docs/queries.html

์—…๋ฐ์ดํŠธ ๋ฏธ๋“ค์›จ์–ด์—์„œ 'this'๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
this.update({field: "value"}, {$set: {updatedAt: new Date()}}); ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„ํ„ฐ์— {field: "value"} ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํšจ๊ณผ๊ฐ€ ์—†๋‚˜์š”? ๋‚ด๊ฐ€ ๋ณด์ง€ ๋ชปํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ronakvora Query#getConditions() ํ•จ์ˆ˜ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

schema.pre('update', function() {
  console.log(this.getConditions()); // Will include `{ field: 'value' }`
});

Gotcha, ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ฌผ๊ฑด์„ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค :). ๊ฐ์‚ฌ ํ•ด์š”!

Ps ์ด๊ฒƒ์€ ์œ„์—์„œ Ronak์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ์žฅ์น˜์— ๋‘ ๊ฐœ์˜ ๊ณ„์ •์ด ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰