์๋
ํ์ธ์, ์ต์ ๋ฒ์ ์ 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 ๋ฏธ๋ค์จ์ด๋ฅผ ์ด ์์๋๋ก ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์์ ์ฃผ์ ์ ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์๋์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ๋ฌธ์๊ฐ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ๋ชฝ๊ตฌ์ค๋ 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 ๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค.
๋ฐ๋ผ์ ๋ค์ ์ฝ๋๋ก ์ํ๋ ๋์์ ์ป์ ์ ์์ต๋๋ค.
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์ ๋๋ค. ๋ถ๋ช ํ ๋ค๋ฅธ ์ฅ์น์ ๋ ๊ฐ์ ๊ณ์ ์ด ๋ก๊ทธ์ธ๋์ด ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์, ์๊ฒ ์ต๋๋ค.
update()
findOneAndUpdate()
๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ญ๋๋ค. ์ด๊ฒ๋ค์ ๋ณ๊ฐ์ ํํฌ๊ฐ ์๋ ๋ ๊ฐ์ ๋ณ๊ฐ์ ๊ธฐ๋ฅ์ด๋ฏ๋ก ์ฌ์ ํํฌ์์findOneAndUpdate
์ ์ ๋ฐ์ดํธ ์์ ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.