Mongoose: ์‚ฌ์ „, ์‚ฌํ›„ ๋ฏธ๋“ค์›จ์–ด๋Š” findByIdAndUpdate์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2012๋…„ 06์›” 15์ผ  ยท  102์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด findAndUpdate ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 Model.findById(_id, function (err, doc) {
      if (doc) {
          doc.field = 'value';
          doc.save(function (err) {
                 // do something;
          });
      }
 });

์ด์—:

   .findByIdAndUpdate(_id, {$set: {field: 'value'}}, function (err, doc) {
        // do something 
    });

์šฐ๋ฆฌ๋Š” pre, post ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ pre, post ๋ฏธ๋“ค์›จ์–ด๋Š” findByIdAndUpdate๋ฅผ ๋งŒ๋“ค ๋•Œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”,

๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋‹ต๋ณ€์— ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. findOneAndUpdate ๋ฐ ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์œ„ํ•œ ์‚ฌํ›„ ์ €์žฅ ๋˜๋Š” ์‚ฌํ›„ ์—…๋ฐ์ดํŠธ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ฌธ์„œ๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋ฏธ๋“ค์›จ์–ด ๋˜๋Š” Model.update์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ์ž‘์—…์— ๋Œ€ํ•ด ๋ธ”๋ผ์ธ๋“œ์ธ mongoosastic๊ณผ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์—†๋‹ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ผ๋ถ€ ์‚ฌํ›„ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

๋””์ž์ธ์— ์˜ํ•ด. ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๊ด€๋ จ๋œ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •, ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ•  ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ? ์‚ฌ์ „, ์‚ฌํ›„ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋„ค ๋งž์Šต๋‹ˆ๋‹ค. Model.update,findByIdAndUpdate,findOneAndUpdate,findOneAndRemove,findByIdAndRemove๋Š” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ€์ด๋“œ ์— ๋ช…ํ™•ํžˆ ๋ช…์‹œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋™์ผํ•œ ํŽ˜์ด์ง€์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ๋งํ•˜๊ณ  findByIdAndUpdate ๋ฅผ "๋” ๋‚˜์€" ๊ฒƒ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

"๋” ๋‚˜์€" ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ „์ฒด ๋ฌธ์„œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์˜
๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md

2012๋…„ 10์›” 31์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 6์‹œ 3๋ถ„, Jesse Fulton [email protected] ์ž‘์„ฑ:

์ด๊ฒƒ์€ ๊ฐ€์ด๋“œhttp://mongoosejs.com/docs/documents.html ์—์„œ ํ™•์‹คํžˆ ๋ช…์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํŠนํžˆ ๋™์ผํ•œ ํŽ˜์ด์ง€์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ
findByIdAndUpdate๋ฅผ "๋” ๋‚˜์€" ๊ฒƒ์œผ๋กœ ์„ค๋ช…

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/LearnBoost/mongoose/issues/964#issuecomment -9967865์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์•„๋ก 
@aaronheckmann https://twitter.com/#!/aaronheckmann

๋ฏธ๋“ค์›จ์–ด ๋ฌธ์„œ์— ๋ฉ”๋ชจ ์ถ”๊ฐ€

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ: https://github.com/LearnBoost/mongoose/pull/1750

์•ˆ๋…•ํ•˜์„ธ์š”,

๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋‹ต๋ณ€์— ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. findOneAndUpdate ๋ฐ ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์œ„ํ•œ ์‚ฌํ›„ ์ €์žฅ ๋˜๋Š” ์‚ฌํ›„ ์—…๋ฐ์ดํŠธ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ฌธ์„œ๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋ฏธ๋“ค์›จ์–ด ๋˜๋Š” Model.update์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ์ž‘์—…์— ๋Œ€ํ•ด ๋ธ”๋ผ์ธ๋“œ์ธ mongoosastic๊ณผ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์—†๋‹ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ผ๋ถ€ ์‚ฌํ›„ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

@albanm ํŠน์ • ๋ฐฉ๋ฒ•์€ ๋ชฝ๊ตฌ์Šค๋ฅผ ์™„์ „ํžˆ ์šฐํšŒ ํ•˜๋ฏ€๋กœ ๋ฏธ๋“ค์›จ์–ด ํ›„ํฌ๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. AFAIK, ํ›„ํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณ„๋„์˜ find() ๋ฐ save() ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฐฉ๋ฒ• ์ด์ „์— ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „ ๋ฏธ๋“ค์›จ์–ด๋Š” ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ mongoose๋Š” ์—…๋ฐ์ดํŠธ๋œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ผ๋ถ€ ํฌ์ŠคํŠธ ํ›„ํฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@albanm ์ด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ์‚ฌ๋žŒ๋“ค์€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ผ๋ถ€ ์ฐจ๋‹จ์œผ๋กœ '์ง์ ‘ ์—…๋ฐ์ดํŠธ' ๋ฉ”์„œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์›๋ž˜ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

+1

+1

+1

+1

:+1:

+1

:-1:
๊ธฐ๋Šฅ ์š”์ฒญ์„ ๋ฐ›์•˜์ง€๋งŒ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋” ์˜ค๋ž˜ ์ž‘์—…ํ• ์ˆ˜๋ก db ์—…๋ฐ์ดํŠธ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์ผ์ƒ์ ์ธ ์ž‘์—…์— ์ผ์ƒ์ ์ด์ง€ ์•Š์€ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ํ˜ธ์ถœํ•  ๋•Œ ์ข…์ข… ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•˜๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ด๋ฏธ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ž˜ํผ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. mongoose๋Š” ์ด์ œ ๋ฒ„์ „ 4์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ v3์—์„œ ์ด ์ •๋„์˜ API ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ v4 ํ† ๋ก ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๊ธฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ :+1: ์ €์žฅ ํ˜ธ์ถœ์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด. ๋‚˜๋Š” ์ข…์ข… ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ์ „๋‹ฌ๋œ ๋ชฝ๊ตฌ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋‹จ์ˆœํžˆ .save๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ๋Š” ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค .save๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์„ธ์š”.

์–ด๋Š ์ชฝ์ด๋“ , ๋†€๋ผ์šด ๋„์„œ๊ด€. ๋ฉ‹์ง„ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๊ฒฝ์˜๋ฅผ ํ‘œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ์—†์ด๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

+1

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_update = UserModel.update
UserModel.update = (conditions, update) ->
  update.updatedAt or= new Date
  _update.apply this, arguments

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชฝ๊ตฌ์Šค์˜ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ํ˜ธ์ถœ์€ ๋ฐ์ดํ„ฐ์˜ updatedAt ํ‚ค๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ ๋ฆผ๋ณด ๋ฅผ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šคํ‚ค๋งˆ์— ์ •์ /๋ฉ”์„œ๋“œ/๋ฎ์–ด์“ฐ๊ธฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•˜๊ณ  mongodb๋ฅผ ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด rpc ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชฝ๊ตฌ์Šค ๋ชจ๋ธ์˜ ๊ฐ„๋‹จํ•œ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.

+1, ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

์ถ”๋ก ์„ ์–ด๋Š ์ •๋„ ์ดํ•ดํ•˜์ง€๋งŒ ์›์ž ์—…๋ฐ์ดํŠธ IMHO์— ๋Œ€ํ•œ ํ›„ํฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Mongoose๋Š” ์‹ค์ œ๋กœ ๋‹ค์†Œ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›์ž ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๊ธฐ๋ณธ๊ฐ’ ๋“ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ODM์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ „์ฒด ๋ชฉ์ ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. ์ฐพ๊ธฐ/์ €์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์ง€๋งŒ ์ด๊ฒƒ์ด ํ•ญ์ƒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ, ์ผ๋ฐ˜์ ์œผ๋กœ ์›์ž์  ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐพ๊ธฐ/์ €์žฅ์„ ํ”ผํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. MongoDB๋Š” ๊ฐ•๋ ฅํ•œ ์›์ž ์ฟผ๋ฆฌ ๋ฐ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ์ง€์› ๋ถ€์กฑ์„ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์›์ž์  ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฏธ๋“ค์›จ์–ด ์ง€์› ์—†์ด Mongoose๋Š” ๊ธฐ๋ณธ MongoClient ๋ณด๋‹ค ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning ์˜ ์˜ˆ์ œ๋„ update ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ๊ด€๋ฆฌ ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ๋‹ค ๊ฒฐํ•ฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๊นŒ? ์ •๋ง, ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์š”์ ์ด ์–ด๋”” ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ธฐ์ˆ ์ ์ธ ์ด์œ ์กฐ์ฐจ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค: If update & co. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ผ๋ถ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ/์‚ฌ์šฉ์ž ์ง€์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์ฟผ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@joerx +1์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. :) ํ•˜์ง€๋งŒ ๋‹น์‹ ์˜ ์ถ”๋ก ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค.

3.9.x ๋ธŒ๋žœ์น˜๋Š” find ๋ฐ findOne ์— ๋Œ€ํ•œ ์‚ฌ์ „ ๋ฐ ์‚ฌํ›„ ํ›„ํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค findOneAndUpdate ๋ฐ update ์— ๋Œ€ํ•œ ์ง€์›์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ pre('findOneAndUpdate') ๋ฐ post('findOneAndUpdate') ํ›„ํฌ๋Š” ๋งˆ์Šคํ„ฐ์— ์žˆ์œผ๋ฉฐ ์•„์ง ์—…๋ฐ์ดํŠธ ํ›„ํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„์ง ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆด๋ฆฌ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ .update() ์ดํ›„์— ์‚ฌ์ „ ์ €์žฅ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. Query.update() ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ update() ํ›„ํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ ํ›„ํฌ๋Š” ์ฟผ๋ฆฌ ํ›„ํฌ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@vkarpov15 ์—…๋ฐ์ดํŠธ ํ›„ํฌ์— ๋Œ€ํ•œ ์ง€์› ๋ฌธ์„œ๋ฅผ ๋งํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? pre('findOneAndUpdate') ๋ฐ post('findOneAndUpdate') ๊ฐ€ ์–ธ์ œ ์ถœ์‹œ๋ ์ง€์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@karlstanton ์‚ฌ์šฉ 4.0.0-rc2, npm install mongoose@unstable :)

'use strict';

var Promise  = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));

var counterSchema = new mongoose.Schema({
    total: {
        type:    Number,
        default: 0
    }
});

counterSchema.post('findOneAndUpdate', function (doc) {
    console.log(doc.total);
});

var Counter = mongoose.model('Counter', counterSchema);

Promise.coroutine(function *() {
    yield mongoose.connectAsync(process.env.MONGODB_URI);
    console.log('Connected');
    let counter = yield Counter.createAsync({});
    console.log(`${counter.total}`);
    for (let i = 0; i < 10; i++) {
        yield Counter.findOneAndUpdateAsync({ _id: counter.id }, { $inc: { total: 1} });
    }
})();
0
0
1
2
3
4
5
6
7
8
9

ํ•œ๋ฐœ์ง ๋ฌผ๋Ÿฌ๋‚œ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„, new ํ”Œ๋ž˜๊ทธ๋Š” ๊ธฐ๋ณธ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋“œ๋ผ์ด๋ฒ„์™€์˜ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•ด ํ•  ๋ง์ด ์žˆ์ง€๋งŒ ํŠนํžˆ ์ด ์ƒˆ๋กœ์šด ํ›„ํฌ๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@๋„ค๋ฒ„ํญ์Šค :)

๋„ค @neverfox ์ž˜ ์žก์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฆด๋ฆฌ์Šค ์ •๋ณด์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ #2262์—์„œ ๋ณ€๊ฒฝ๋œ ์ด์œ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” mongodb ๋…ธ๋“œ ๋“œ๋ผ์ด๋ฒ„, mongodb ์…ธ, ์‹ค์ œ mongodb ์„œ๋ฒ„ ๋“ฑ์—์„œ new ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ false์ด๊ณ  ๋น„ํ‘œ์ค€ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ž˜ํผ ๊ณ„์ธต์ด ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋”์ฐํ•˜๊ฒŒ ์ž˜๋ชป๋œ ๋ชจ๋“ˆ์˜ ์ •์‹ ์˜ˆ๋Š” gulp-uglify ์ž…๋‹ˆ๋‹ค. ์ด๋Š” uglify-js์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ ๋ฒ„์ „ 4.0.2์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์•„์ง ๋ถˆ์•ˆ์ •ํ•œ ๋ฒ„์ „์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Scema.pre('update') ๋˜๋Š” Schema.pre('findOneAndUpdate') 4.0.2 ๋ฒ„์ „์˜ findOneAndUpdate์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@CaptainStaplerz ํ”„๋ฆฌํ›…์„ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

findOneAndUpdate ๋ฏธ๋“ค์›จ์–ด ํ›„ํฌ๋ฅผ 4.0.2์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 3.8์—์„œ ์ตœ์‹  mongoose 4.0.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ ๋ฏธ๋“ค์›จ์–ด Document.schema.post('findOneAndUpdate', function (doc)๊ฐ€ save() ๋˜๋Š” remove()์ฒ˜๋Ÿผ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@honitus ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ์„ธ์š”

@vkarpov15 - ๋น ๋ฅธ ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ.์ปจํŠธ๋กค๋Ÿฌ,js

// Updates an existing Blog in the DB, adds comment
exports.update = function(req, res) {

Blog.findOneAndUpdate(
     {"_id": req.body._id,},
      {"$push": {"comments": buildComment}},
     {safe: true, upsert: true}, function (err, workspace) {
      if (err) {
         return handleError(res, err);
       }
       return res.send(200);
      }
   );

}

๋ธ”๋กœ๊ทธ.์†Œ์ผ“.js

/**
 * Broadcast updates to client when the model changes
 */

'use strict';

var Blog= require('./blog.model');

exports.register = function(socket) {
//SAVE WORKS
  Blog.schema.post('save', function (doc) {
    onSave(socket, doc);
  });

// IS NOT TRIGGERED :(
 Blog.schema.post('findOneAndUpdate', function (doc) {
    onComment(socket, doc);
  });

  Blog.schema.post('remove', function (doc) {
    onRemove(socket, doc);
  });
}

//SAVE WORKS when a new blog is created
function onSave(socket, doc, cb) {
  socket.emit('blog:save', doc);
}

// IS NOT TRIGGERED :(
function onComment(socket, doc, cb) {
  socket.emit('blog:findOneAndUpdate', doc);
}

function onRemove(socket, doc, cb) {
  socket.emit('blog:remove', doc);
}

@vkarpov15 ๋‹ค์‹œ ์—ด์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ findOneAndUpdate์— ๋Œ€ํ•œ ํ›„ํฌ๊ฐ€ 4.0.2์— ์—†๊ณ  4.0.3์— ํฌํ•จํ•  ๊ณ„ํš์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

@vkarpov15 ๋‹ค์Œ์€ ํ›„ํฌ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

...
var TodoSchema = new mongoose.Schema({
  name: {type: String, required: true},
  note: String,
  completed: {type: Boolean, default: false},
  updatedAt: {type: Date, default: Date.now},
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'Users'
  }
});
...
// Not executed
TodoSchema.pre('update', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});
// Not executed
TodoSchema.pre('findOneAndUpdate', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

...
router.route('/:id')
.put(function(req, res, next) {
  TodoModel.findOneAndUpdate({_id: req.params.id, user: req.user.id}, req.body, {new: true}, function(err, post) {
    if(err) return next(err);
    if(post) {
      res.status(200).json(post);
    }
    else {
      next(newSystemError(errorCodes.TODO_NOT_FOUND, undefined, req.params.id));
    }
  });
});

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ findOneAndUpdate() ํ›„ํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค.

@CaptainStaplerz ์‹œ๋„:

TodoSchema.pre('update', function(next) {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
  next();
});

๋˜ํ•œ console.log ๋ฌธ์ด ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š” Date.now() ๋ถ€๋ถ„์ž…๋‹ˆ๊นŒ?

@vkarpov15
Add implementation #964 https://github.com/Automattic/mongoose/commit/e98ef98e857965c4b2ae3339fdd7eefd2a5a9913 ์—์„œ ๋ณ€๊ฒฝํ•œ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ง€๊ธˆ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฉ”์ธ์— ์ฒดํฌ์ธ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@honitus mongoose 4.0.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ 4.0.0 ์ด์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

honitus$ npm ๋ณด๊ธฐ ๋ชฝ๊ตฌ์Šค ๋ฒ„์ „
4.0.2

@honitus ๋‹น์‹ ์ด ์ž˜๋ชปํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์€ ๋ชจ๋ธ์„ ์ปดํŒŒ์ผ ํ•œ ํ›„ ์Šคํ‚ค๋งˆ์— ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Model.schema.pre('remove'); ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ๋ฌธ์„œ์—์„œ "์ฒซ ๋ฒˆ์งธ ๋ชจ๋ธ ์ปดํŒŒ์ผ"์„ ์ฐธ์กฐํ•˜์„ธ์š” . ๋จผ์ € ํ›„ํฌ๋ฅผ ์Šคํ‚ค๋งˆ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

@CaptainStaplerz ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋นˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

var mongoose = require('mongoose');
mongoose.set('debug', true);
var util = require('util');

mongoose.connect('mongodb://localhost:27017/gh964');

var TodoSchema = new mongoose.Schema({
  name: {type: String, required: true},
  note: String,
  completed: {type: Boolean, default: false},
  updatedAt: {type: Date, default: Date.now},
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'Users'
  }
});
TodoSchema.pre('update', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});
TodoSchema.pre('findOneAndUpdate', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});

var Todo = mongoose.model('Todo', TodoSchema);

Todo.update({}, { note: "1" }, function(err) {
  if (err) {
    console.log(err);
  }
  console.log('Done');
  process.exit(0);
});

๊ทธ๋Ÿฌ๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„์šฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

var mongoose = require('mongoose');
mongoose.set('debug', true);
var util = require('util');

mongoose.connect('mongodb://localhost:27017/gh964');

var TodoSchema = new mongoose.Schema({
  name: {type: String, required: true},
  note: String,
  completed: {type: Boolean, default: false},
  updatedAt: {type: Date, default: Date.now},
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'Users'
  }
});
TodoSchema.pre('update', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});
TodoSchema.pre('findOneAndUpdate', function() {
  console.log('------------->>>>>> update updatedAt')
  this.updatedAt = Date.now();
});

var Todo = mongoose.model('Todo', TodoSchema);

Todo.update({}, { }, function(err) {
  if (err) {
    console.log(err);
  }
  console.log('Done');
  process.exit(0);
});

์‚ฌ์ „ ์—…๋ฐ์ดํŠธ ํ›„ํฌ๊ฐ€ ๋” ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ?

@vkarpov15
Model.schema.pre('์ œ๊ฑฐ'); Angular ์ „์ฒด ์Šคํƒ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์Šคํ… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. #964 e98ef98
๋‚ด๊ฐ€ ํ•œ ๊ฒƒ์€ ์•„๋ž˜์— ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
this._schema.s_.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,
4.0.2์˜ 1526ํ–‰ ์ฐธ์กฐ - this.model.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,

1526ํ–‰์„ this.schema.s.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,
์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Mongoose๋Š” ๋ชจ๋ธ์ด ์ปดํŒŒ์ผ๋œ ํ›„(์ฆ‰, mongoose.model() ํ˜ธ์ถœ) ์Šคํ‚ค๋งˆ ํ›„ํฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@vkarpov15 ์ด์ œ ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ํ›„ํฌ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋ฆฌ์„์€ ์˜คํƒ€ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TodoSchema.pre('findOneAndUpdate', function(next) {
  console.log('------------->>>>>> update updatedAt: ', this.updatedAt);
  this.updatedAt = Date.now();
  next();
});

๊ทธ๋Ÿฌ๋‚˜ 'this'๋Š” ์—…๋ฐ์ดํŠธ๋œ ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ '์ €์žฅ' ํ›„ํฌ์—์„œ๋Š” ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ?). ๋”ฐ๋ผ์„œ this.updatedAt๋Š” ์ •์˜๋˜์ง€ ์•Š์Œ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

'findOneAndUpdate' -hook์—์„œ 'updatedAt' -ํ•„๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋” ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค findOneAndUpdate ํ˜ธ์ถœํ•  ๋•Œ ์—…๋ฐ์ดํŠธ ์ค‘์ธ ๋ฌธ์„œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ this ๊ฐœ์ฒด๋Š” ์ฟผ๋ฆฌ ๋ฏธ๋“ค์›จ์–ด ์˜ ๋ฌธ์„œ ๊ฐ€ ์•„๋‹Œ ์ฟผ๋ฆฌ ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. this.update({ $set: { updatedAt: Date.now() } }); ์‹œ๋„

@vkarpov15 this.update({ $set: { updatedAt: Date.now() } }); ๋ฅผ ์ž‘๋™์‹œํ‚ค์ง€ ๋ชปํ–ˆ์ง€๋งŒ findOneAndUpdate this._update['$setOnInsert'].updatedAt=Date.now(); ๋กœ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. this.update() ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ์ƒ๋‹นํžˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ณด์—ฌ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ™•์‹ ํ•˜๋Š”! (์ฐธ๊ณ ๋กœ ์ €๋Š” 4.0.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

tagSchema.pre('findOneAndUpdate',function(next){
  var self = this;

  //NOTE THAT 'this' in the findOneAndUpdate hook refers to the query, not the document
  //https://github.com/Automattic/mongoose/issues/964

  geoData.country.findOne({'_id':self._update['$setOnInsert'].countryCode}).select('_id name cca2 cca3 ccn3').lean().exec(function(err,country){
    if (err){throw err;}
    if (!country){throw 'no coutnry';}
    self._update['$setOnInsert'].country=country;
    next();
  });
});

๋‚ด ์•ฑ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฌธ์„œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชฝ๊ตฌ์Šค์— ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ƒ๊ฐ์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์˜ˆ, ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ update ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ

var mongoose = require('mongoose');
mongoose.set('debug', true);
var util = require('util');

mongoose.connect('mongodb://localhost:27017/gh964');

var TodoSchema = new mongoose.Schema({
  name: {type: String, required: true},
  note: String,
  completed: {type: Boolean, default: false},
  updatedAt: {type: Date, default: Date.now},
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'Users'
  }
});
TodoSchema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { updatedAt: Date.now() });
});

var Todo = mongoose.model('Todo', TodoSchema);

Todo.findOneAndUpdate({}, { note: "1" }, function(err) {
  if (err) {
    console.log(err);
  }
  console.log('Done');
  process.exit(0);
});

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์›ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Mongoose: todos.findAndModify({}) [] { '$set': { note: '1', updatedAt: new Date("Thu, 07 May 2015 20:36:39 GMT") } } { new: false, upsert: false }
Done

๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค

TodoSchema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { updatedAt: Date.now() });
});

mquery์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹  - ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์‹ค์ œ๋กœ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€? ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ํ›„ํฌ๋Š” '์ €์žฅ'์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ์™„์ „ํžˆ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” 4.0.6์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”

@agjs ๋Š” ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

UserController.prototype.updateAvatar = function (req, res) {
    return new Promise(function (resolve, reject) {
        CompanyDetails.update({
            _author: req.user._id
        }, {
            avatarPath: req.files.file
        }, function (error, updated) {
            if (error) {
                reject(error);
            } else {
                resolve(updated);
            }
        });
    }).then(function (resolved) {
        res.sendStatus(204).send(updated);
    }).catch(function (error) {
        next(error);
    })

};

CompanyAvatarSchema.pre('update', function (next) {
    console.log('pre save');
    let VirtualModel = this,
        parent = this.ownerDocument(),
        PATH = path.normalize('./public/images/uploads/avatars/' + parent._id);

    mkdirp(PATH, function (error) {
        if (error) {
            next(error);
        } else {
            fs.rename(VirtualModel.path, path.join(PATH, VirtualModel.name), function (error2) {
                if (error2) {
                    next(error2);
                } else {
                    next();
                }
            });
        }
    });

});

model.create ๋ฐ pre-save๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ํ›„ํฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฌด์—‡์ด๋“ ๊ฐ„์—, ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํ›„ํฌ๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ  console.log์กฐ์ฐจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. findOneAndUpdate ๋“ฑ๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ... ์›ƒ๊ธด ๊ฒƒ์€์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ‰์†Œ์™€ ๊ฐ™์ด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ ๊ฑฐ๊ธฐ์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ CompanyAvatarSchema์™€ CompanyDetails์˜ ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํšŒ์‚ฌ ์„ธ๋ถ€ ์ •๋ณด์—๋Š” ํ•˜์œ„ ๋ฌธ์„œ๋กœ CompanyAvatar.schema๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

avatarPath: {
        type: [CompanyAvatar.schema],
        required: true
    }

๋˜ํ•œ ์‚ฌ์ „ ํ›„ํฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋„ ์™„์ „ํžˆ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•˜์œ„ ๋ฌธ์„œ๋Š” ์ฑ„์›Œ์ง€์ง€๋งŒ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์‚ฌ์ „ ํ›„ํฌ๋ฅผ ๋ชจ๋‘ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌ๊ธ€๋ง ํ–ˆ๊ณ  ์ด๊ฒƒ๋„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด new aka var parent = new Parent()๋กœ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ณ  ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

CompanyDetails.update() ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์ „ ํ›„ํฌ๋Š” ๋ณ„๋„์˜ ์Šคํ‚ค๋งˆ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋Š” ์ค‘์ฒฉ ์Šคํ‚ค๋งˆ์˜ pre('update') atm์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ '๊ฒ€์ฆ์ด ์™„์ „ํžˆ ๋ฌด์‹œ๋จ' ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ฒ ์ €ํ•œ ์ฝ”๋“œ ์˜ˆ์ œ๋„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ์€ ํ”„๋กœํ•„(์•„๋ฐ”ํƒ€ ์‚ฌ์ง„)์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์‚ฌ์ „ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ๋งŒ๋“  ํšŒ์‚ฌ ์•„๋ฐ”ํƒ€ ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.

'use strict';

let mongoose = require('mongoose'),
    mkdirp = require('mkdirp'),
    fs = require('fs'),
    path = require('path'),
    Schema = mongoose.Schema;

let CompanyAvatarSchema = new Schema({
    name: String,
    width: Number,
    height: Number,
    size: Number,
    type: String
});


CompanyAvatarSchema.path('type').validate(function (type) {
    return /^image\//.test(type);
}, 'Image type not allowed!');

CompanyAvatarSchema.path('size').validate(function (size) {
    return size < 5;
}, 'Image too big!');



CompanyAvatarSchema.virtual('path').set(function (path) {
    return this._path = path;
}).get(function () {
    return this._path;
});


CompanyAvatarSchema.virtual('public_path').get(function () {
    var parent = this.ownerDocument();
    var PATH = path.normalize('images/uploads/avatars/' + parent._id);
    if (this.name) {
        return path.join(PATH, this.name);
    }
});

CompanyAvatarSchema.set('toJSON', {
    getters: true
});

CompanyAvatarSchema.pre('findOneAndUpdate', function (next) {
    console.log('pre save');
    let VirtualModel = this,
        parent = this.ownerDocument(),
        PATH = path.normalize('./public/images/uploads/avatars/' + parent._id);

    mkdirp(PATH, function (error) {
        if (error) {
            next(error);
        } else {
            fs.rename(VirtualModel.path, path.join(PATH, VirtualModel.name), function (error2) {
                if (error2) {
                    next(error2);
                } else {
                    next();
                }
            });
        }
    });

});


let runValidatorsPlugin = function (schema, options) {
    schema.pre('findOneAndUpdate', function (next) {
        this.options.runValidators = true;
        next();
    });
};

CompanyAvatarSchema.plugin(runValidatorsPlugin);

let CompanyAvatar = mongoose.model('CompanyAvatar', CompanyAvatarSchema);
module.exports = CompanyAvatar;

๋‹ค์Œ์€ company_avatar๊ฐ€ ํ•˜์œ„ ๋ฌธ์„œ์ธ company_details ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.

let CompanyDetailsSchema = new mongoose.Schema({
    _author: [{
        type: Schema.Types.ObjectId,
        ref: 'CompanyAccount'
    }],
    company_name: {
        type: String,
        es_indexed: true,
        es_boost: 2.0
    },
    contact_email: {
        type: String,
        es_indexed: true
    },
    website: {
        type: String,
        es_indexed: true
    },
    country: {
        type: String,
        es_indexed: true
    },
    industry: {
        type: String,
        es_indexed: true
    },
    address: {
        type: String,
        es_indexed: true
    },
    about: {
        type: String,
        es_indexed: true
    },
    avatarPath: {
        type: [CompanyAvatar.schema],

    }
});

๊ทธ๋ฆฌ๊ณ  ์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ๊ฒ€์ฆ/์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ์—…๋ฐ์ดํŠธ ํ”„๋กœํ•„ ์ปจํŠธ๋กค๋Ÿฌ์™€ avatarPath๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

UserController.prototype.updateAvatar = function (req, res, next) {
    let updates = {
        $set: {
            avatarPath: req.files.file
        }
    };
    return new Promise(function (resolve, reject) {
        CompanyDetails.findOneAndUpdate({
            _author: req.user._id
        }, updates, function (error) {
            if (error) {
                reject(error);
            } else {
                resolve('done');
            }
        });
    }).then(function () {
        res.sendStatus(204);
    }).catch(function (error) {
        next(error);
    });

};

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด mongodb๋Š” req.files.file์˜ ํ•„๋“œ๋กœ ์ฑ„์›Œ์ง€์ง€๋งŒ ๊ทธ ์™ธ์—๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ๋ฌด์‹œ๋˜๊ณ  ํ›„ํฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” pre('findOneAndUpdate') ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์ค‘์ฒฉ๋œ ์Šคํ‚ค๋งˆ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ mongoose๋Š” ์ตœ์ƒ์œ„ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋ฏธ๋“ค์›จ์–ด๋งŒ ์‹คํ–‰ํ•˜๋ฏ€๋กœ CompanyDetailsSchema ์— ์ •์˜๋œ ๋ฏธ๋“ค์›จ์–ด๋Š” ๋‹ค์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. #3125

+1

@vkarpov15 ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค

TodoSchema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { updatedAt: Date.now() });
});

์†์„ฑ์„ ํ•˜๋“œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€๋งŒ ์•”ํ˜ธ๋ฅผ ํ•ด์‹œํ•˜๋Š” ๋“ฑ ์†์„ฑ์„ ์–ด๋–ป๊ฒŒ _์ฝ๊ณ  ๋ณ€๊ฒฝ_ํ•ฉ๋‹ˆ๊นŒ?

TodoSchema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { password: hashPassword(.....?....) });
});

์ด๊ฒฌ์žˆ๋Š” ์‚ฌ๋žŒ? ์ด๊ฒƒ์€ ๊ฝค ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋งž์ฃ ? ์•„๋‹ˆ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๋ณดํ†ต find() ํ•˜๊ณ  save() ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

TodoSchema.pre('findOneAndUpdate', function() {
  this.findOneAndUpdate({}, { password: hashPassword(this.getUpdate().$set.password) });
});

@willemmulder๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@vkarpov15 ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์˜ค๋Š˜ ๋ฐค์— ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. pre('update') ์—์„œ๋„ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€ ์•Š๋‚˜์š”?

@ vkarpov15 ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

schema.pre('update', function(next) {
this.update({}, { $set : { password: bcrypt.hashSync(this.getUpdate().$set.password) } });
next();
});

๋‚ด๊ฐ€ console.log this ํ•˜๋ฉด

_update: { '$set': { password: '$2a$10$CjLYwXFtx0I94Ij0SImk0O32cyQwsShKnWh1248BpYsJLIHh7jb66', postalAddress: [Object], permissions: [Object], firstName: 'Willem', lastName: 'Mulder', email: '...@...', _id: 55ed4e8b6de4ff183c1f98e8 } },

๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ(์ง์ ‘ ๊ทธ ์†์„ฑ์„ ์„ค์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ธฐ๋„ ํ–ˆ์ง€๋งŒ) ๊ฒฐ๊ตญ์—๋Š” ์‹ค์ œ๋กœ ํ•ด์‹œ๋œ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ '์›์‹œ' ๊ฐ’์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ƒํ•˜๋‹ค. require('mongoose').set('debug', true); ๋กœ mongoose ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  db๋กœ ์ „์†ก๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ๊ทธ๋ ‡๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค :

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค:

schema.pre('update', function(next) {
    this.update({}, { password: bcrypt.hashSync(this.getUpdate().$set.password) } );
    console.log(this.getUpdate());
    next();
});

console.log์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{ '$set':
   { password: '$2a$10$I1oXet30Cl5RUcVMxm3GEOeTFOLFmPWaQvXbr6Z5368zbfpA8nFEK',
     postalAddress: { street: '', houseNumber: '', zipCode: '', city: '', country: '' },
     permissions: [ '' ],
     __v: 0,
     lastName: '',
     firstName: '',
     email: '[email protected]',
     _id: 563b0410bd07ce2030eda26d } }

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ชฝ๊ตฌ์Šค ๋””๋ฒ„๊ทธ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Mongoose: users.update({ _id: ObjectId("563b0410bd07ce2030eda26d") }) { '$set': { password: 'test', postalAddress: { street: '', houseNumber: '', zipCode: '', city: '', country: '' }, permissions: [ '\u001b[32m\'\'\u001b[39m' ], __v: 0, lastName: '', firstName: '', email: '[email protected]', _id: ObjectId("563b0410bd07ce2030eda26d") } } { overwrite: false, strict: true, multi: false, upsert: false, safe: true }
Mongoose: users.findOne({ _id: ObjectId("563b0410bd07ce2030eda26d") }) { fields: { password: 0 } }

์–ด๋–ค ๋‹จ์„œ?

ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•  ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

@vkarpov15 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@vkarpov15 ์‚ฌ์ „ ํ›„ํฌ์—์„œ ์ง„ํ–‰ ์ค‘์ธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  finishSchema.pre('findOneAndUpdate', function (next) {
    this.setOptions({
      new: true,
      runValidators: true
    });
    this.update({}, {
      lastEdited: Date.now()
    });
    next();
  });

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ http://mongoosejs.com/docs/api.html#query_Query -setOptions์—๋Š” ์ด๋Ÿฌํ•œ ์˜ต์…˜์ด ์–ธ๊ธ‰๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•ดํ‚น๋œ ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋ฉด ๋ฌด์—‡์ด ๋” ์ ์ ˆํ• ๊นŒ์š”?

๊ทธ๊ฒƒ์€ ๋ฌธ์„œ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์–ธ๋œป๋ณด๊ธฐ์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@vkarpov15 ์˜ˆ, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

setOptions ๋Š” new ๋ฐ runValidators ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” setOptions ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด this.options ๋ณด๋‹ค ์„ ํ˜ธ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋ฌป๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

setOptions() ๊ฐ€ ์„ ํ˜ธ๋˜๋Š” IMO์ด์ง€๋งŒ ๋‘˜ ๋‹ค ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

this.update({}, { lastEdited: Date.now() }, { new: true, runValidators: true });
schema.pre('update', function(next) {
this.update({}, { $set : { password: bcrypt.hashSync(this.getUpdate().$set.password) } });
next();
});

์ด๊ฒƒ์€ ๋ชจ๋“  update() ํ˜ธ์ถœ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์†์„ฑ, ์ฆ‰ ์ด๋ฆ„์ด๋‚˜ ๋‚˜์ด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ์—…๋ฐ์ดํŠธ๋˜๋Š”๋ฐ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค!?

@nlonguit ๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฌ๋‚˜ ์—…๋ฐ์ดํŠธ๋  this ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if (this._fields.password) { // <- I'm sure about this one, check in debugger the properties of this 
    this.update({}, { $set : { password: bcrypt.hashSync(this.getUpdate().$set.password) } });
}

if (this._update.$set.password) { this.update({}, { $set: { password: bcrypt.hashSync(this.getUpdate().$set.password)} }); }

์ด ์ฝ”๋“œ๋Š” ์ €์—๊ฒŒ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. @akoskm ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

findByIdAndUpdate์— ๋Œ€ํ•œ ์‚ฌ์ „ ํ›„ํฌ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ํ›„ํฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ–ˆ๊ณ  ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค. findById๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ์ €์žฅํ•œ ๋‹ค์Œ findByIdAndUpdate ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

dbModel.findById(barId, function (err, bar) {
        if (bar) {

            bar.save(function (err) {
                if (err) throw err;
            });
        }
    });
    dbModel.findByIdAndUpdate(barId, {$set:req.body}, function (err, bar) {
        if (err) throw err;
        res.send('Updated');
    });`

๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋„๋ก ์†์„ฑ์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

schema.post('findOneAndUpdate', function(result) {
    console.log(result.comments.length);
    this.findOneAndUpdate({}, { totalNumberOfComments: result.comments.length });
});

์ฟผ๋ฆฌ๊ฐ€ totalNumberOfComments๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ํ•„๋“œ๊ฐ€ 0์œผ๋กœ ์œ ์ง€๋˜์ง€๋งŒ(์Šคํ‚ค๋งˆ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’: 0์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ์˜ฌ๋ฐ”๋ฅธ ๊ธธ์ด๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ์˜ ๋์— console.log(this) ๊ฐ€ ์žˆ์„ ๋•Œ query ์— ๋‹ค์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_update: { '$push': { comments: [Object] }, totalNumberOfComments: 27 }

๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋ฅผ ์ผค ๋•Œ ์ฟผ๋ฆฌ๊ฐ€ Mongoose์— ์˜ํ•ด ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

@zilions this.findOneAndUpdate({}, { totalNumberOfComments: result.comments.length }).exec(); ๋Š” ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :) ํฌ์ŠคํŠธ ์ €์žฅ ํ›„ํฌ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌํ›„ ์ €์žฅ ํ›„ํฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๊ธฐ์—์„œ ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ์–ป๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@vkarpov15 ์•„ ๊ทธ๋ ‡๊ตฐ์š”! ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Œ€์‹  this.update({} {....}).exec() ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)
์งˆ๋ฌธํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ findOneAndUpdate ์˜ ์›๋ž˜ ์—…๋ฐ์ดํŠธ๋„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ totalNumberOfComments ํ•„๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

Post.findOneAndUpdate({_id: fj394hri3hfj}, {$push: {comments: myNewComment}})

๋‹ค์Œ ํ›„ํฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

schema.post('findOneAndUpdate', function(result) {
    this.update({}, {
        totalNumberOfComments: result.comments.length
    }).exec();
}));

ํ•˜์ง€๋งŒ ํ›„ํฌ๋Š” $push ์—์„œ comments $๋กœ ๋‹ค์‹œ myNewComment ์ด๋ฏ€๋กœ ์ค‘๋ณต ํ•ญ๋ชฉ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— -

schema.post('findOneAndUpdate', function(result) {
    this.update({}, {
        totalNumberOfComments: result.comments.length
    }).exec();
}));

๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜๋‹ค

var query = Post.findOneAndUpdate({_id: fj394hri3hfj}, {$push: {comments: myNewComment}});
query.update({}, {
        totalNumberOfComments: result.comments.length
    }).exec();
query.findOneAndUpdate().exec();

์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

schema.post('findOneAndUpdate', function(result) {
    this.model.update({}, { // <--- `this.model` gives you access to the `Post` model
        totalNumberOfComments: result.comments.length
    }).exec();
}));

์‚ฌ์ „ ์ €์žฅ ํ›„ํฌ๋ฅผ ๋งŒ์ง€์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

router.put('/:id', jsonParser, function(req, res, next) {

  currentCollection.findByIdAndUpdate(req.params.id, req.body, function (err, item) {
    if (err) {
        res.status(404);
        return res.json({'error': 'Server Error', 'trace': err});
    }
    item.save(); // <=== this is were you save your data again which triggers the pre hook :)
    res.status(200); 
    return res.json({'message': 'Saved successfully'});
  });
});

๋ชจ๋ธ์„ ์ •์˜ํ•˜๊ณ  pre ํ›„ํฌ๋ฅผ ์ •์˜ํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก:

์ž‘๋™ํ•˜์ง€ ์•Š์Œ:

// Create Model
let model = Database.Connection.model(`UserModel`, this._schema, `users`);

// Attach Pre Hook
this._schema.pre(`findOneAndUpdate`, function(next) {
    console.log('pre update');
    return next();
});

์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ:

// Attach Pre Hook
this._schema.pre(`findOneAndUpdate`, function(next) {
    console.log('pre update');
    return next();
});

// Create Model
let model = Database.Connection.model(`UserModel`, this._schema, `users`);

์ด๊ฒƒ์ด ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๋ฐฉ๊ธˆ @nicky-lenaers์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

'safe' ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 'delete' . ๋“ฑ. ๋ชจ๋ธ์ด ์ •์˜๋œ ํ›„ ํ›„ํฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ.

๋ชจ๋ธ์ด ์ •์˜๋œ ํ›„ 'findOneAndUpdate' ํ›„ํฌ๋ฅผ ์ •์˜ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@albert-92 ์•„๋‹ˆ์š” ์ง€๊ธˆ์€ ์•„๋‹™๋‹ˆ๋‹ค

์˜ˆ์ „์— ์ข‹์•„ํ–ˆ๋˜ ๊ฒƒ์„ ์–ป์œผ๋ ค๊ณ  ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด

SCHEMA.pre('validate', function(done) {
    // and here use something like 
    this.yourNestedElement 
    // to change a value or maybe create a hashed character    
    done();
});

์ด๊ฒƒ์€ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

SCHEMA.pre('findOneAndUpdate', function(done){
    this._update.yourNestedElement
    done();
});

์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ŠคํŠธ ํ›„ํฌ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

`module.exports = ํ•จ์ˆ˜(๋ชฝ๊ตฌ์Šค) {
var mySchema = ๋ชฝ๊ตฌ์Šค.์Šคํ‚ค๋งˆ({
id: { ์œ ํ˜•: ์ˆซ์ž, ์ƒ‰์ธ: { ๊ณ ์œ : ์ฐธ } },
field1: { ์œ ํ˜•: ๋ฌธ์ž์—ด },
field2: {์œ ํ˜•: ๋ฌธ์ž์—ด}
}, {
์ปฌ๋ ‰์…˜: "mySchema",
๋ฒ„์ „ ํ‚ค: ๊ฑฐ์ง“
});

mySchema.post('findOneAndUpdate', function (result) {
    this.model.update({}, {
        field2: 'New Value'
    }).exec();
});
return mySchema;

}`

mySchema.findOneAndUpdate({id: 1}, {field1: 'test'}, {new: true});

์ปฌ๋ ‰์…˜์˜ ํ•„๋“œ๋ฅผ { id:1, field1: 'test' )๋กœ ์„ค์ •ํ•˜์ง€๋งŒ {id: 1, field1: 'test', field2:'New Value'}์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ findOneAndUpdate์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
mySchema.post('findOneAndUpdate', function (result) { result.field2 = 'something' });

๋ชจ๋ธ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์š”์†Œ๋กœ ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ž˜๋ชป ์„ ํƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. mySchema.post์—์„œ "this"๋ฅผ ์ธ์‡„ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๊ฒŒ์‹œ๋ฌผ์— done() ๋˜๋Š” next()๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ฃผ์ œ์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์ธ์‡„ํ•˜๋ฉด ์ตœ์†Œํ•œ ๋‹น์‹ ์ด ๋ฌด์—‡์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ์˜ ํฌ์ธํŠธ๋Š” ๋ชจ๋ธ์— ์žˆ๋Š” ๊ธฐ์กด ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€์š”?

์ด๊ฒƒ์€ ์ฟผ๋ฆฌ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ํฌ์ŠคํŠธ ํ›„ํฌ์—์„œ done ๋˜๋Š” next๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ๋ชจ๋ธ์ด ์•„๋‹Œ ์Šคํ‚ค๋งˆ์ธ this.model.update๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” .. ๋‹น์‹ ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mySchema.post('findOneAndUpdate', function (result) {
    this.model.update({}, {
        $set: { field2: 'New Value'}
    }).exec();
});
return mySchema;

๋ชจ๋ธ ๋‚ด๋ถ€์—์„œ ๋ชจ๋ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๊ฑฐ๊พธ๋กœ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ "this" ๊ฐ์ฒด์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. findOneAndUpdate๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๊ทธ ์œ„์— ๋‹ค๋ฅธ ๋ชจ๋ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  findOneAndUpdate๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งค๋‹ˆ์ €์—์„œ

var data = yourNewData;
self.findOneAndUpdate({id: something._id}, data, {safe: false, new: true})
    .exec()
    .then(resolve)
    .catch(reject);

์œ„์˜ ์˜ˆ์—์„œ this._update๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด ์ด๊ฒƒ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์—…๋ฐ์ดํŠธ ๊ฐ์ฒด์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

$set์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์— ์žˆ๋Š” ๋‚ด ๋ฌธ์„œ๋Š” ์—ฌ์ „ํžˆ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‚ฌ์ „ ๋ฐ ์‚ฌํ›„ ํ›„ํฌ๋Š” ์–ด๋””์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฏธ๋“ค์›จ์–ด ๋ฌธ์„œ http://mongoosejs.com/docs/middleware.html

+1

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