Mongoose: рдкреВрд░реНрд╡, рдкреЛрд╕реНрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ findByIdAndUpdate рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬреВрди 2012  ┬╖  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 
    });

рд╣рдореЗрдВ рдкреНрд░реА, рдкреЛрд╕реНрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдм рдореИрдВ findByIdAndUpdate рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЕрднреА рдкреВрд░реНрд╡ рдореЗрдВ, рдкреЛрд╕реНрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ,

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд╡рд╛рдм рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВред рдХреНрдпрд╛ FindOneAndUpdate рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкреЛрд╕реНрдЯ-рд╕реЗрд╡ рдпрд╛ рдкреЛрд╕реНрдЯ-рдЕрдкрдбреЗрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдпрд╛ рдореЙрдбрд▓.рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдпрд╣ рдореЛрдВрдЧреЛрд╕реИрд╕реНрдЯрд┐рдХ рдЬреИрд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЕрдВрдзрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдХреЛрдИ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдзрдиреНрдпрд╡рд╛рдж

рд╕рднреА 102 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ред рд╣реБрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕реБрдзрд╛рд░, рд╣реБрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП? рдЕрдЧрд░ рдореИрдВ рдкреНрд░реА, рдкреЛрд╕реНрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рд╣рд╛рдВ рдпрд╣ рд╕рд╣реА рд╣реИред Model.update,findByIdAndUpdate,findOneAndUpdate,findOneAndRemove,findByIdAndRemove рд╕рднреА рдХрдорд╛рдВрдб рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд╛рдЗрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдЙрд╕реА рдкреГрд╖реНрда рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ findByIdAndUpdate рдХреЛ "рдмреЗрд╣рддрд░" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдпрджрд┐ рдЖрдк "рдмреЗрд╣рддрд░" рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдХреЗ рдкреВрд░реНрдг рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ
рд╡рд╣ рд╡рд┐рдзрд┐ рдЬрд╣рд╛рдБ рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдЖрджрд┐ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреА рд╣реИред

рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХрд╛
рдРрд╕рд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:
https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md

рдмреБрдзрд╡рд╛рд░, 31 рдЕрдХреНрдЯреВрдмрд░, 2012 рдХреЛ рд╢рд╛рдо 6:03 рдмрдЬреЗ, рдЬреЗрд╕реА рдлреБрд▓реНрдЯрди рдиреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.comрд▓рд┐рдЦрд╛ :

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрд╛рдЗрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП 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 рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкреЛрд╕реНрдЯ-рд╕реЗрд╡ рдпрд╛ рдкреЛрд╕реНрдЯ-рдЕрдкрдбреЗрдЯ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдпрд╛ рдореЙрдбрд▓.рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред

рдпрд╣ рдореЛрдВрдЧреЛрд╕реИрд╕реНрдЯрд┐рдХ рдЬреИрд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЕрдВрдзрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдХреЛрдИ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реИ рдХрд┐ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХреБрдЫ рдкреЛрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдзрдиреНрдпрд╡рд╛рдж

@albanm рдХреБрдЫ рддрд░реАрдХреЗ рдиреЗрд╡рд▓реЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реБрдХ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред AFAIK, рд╣реБрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рдЧ find() рдФрд░ save() рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдкреНрд░реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдлрд╝реЗрдЪрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдиреЗрд╡рд▓рд╛ рдЕрджреНрдпрддрди рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрджреНрдпрддрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкреЛрд╕реНрдЯ рд╣реБрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @albanm рд╕рд╣реА рд╣реИ, рдЬрдм рд▓реЛрдЧ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд▓реЛрдЧ рд╡рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪреЗрдХ рдХреЗ рдХреБрдЫ рдЕрд╡рд░реЛрдз рдХреЗ рд╕рд╛рде рдЙрди 'рд╕реАрдзреЗ рдЕрджреНрдпрддрди' рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рдкреЗрдЯреЗрдВ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╣реБрдХ рдореМрдЬреВрдж рд╣реИ? рдпрджрд┐ рд╣реБрдХ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдореВрд▓ рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдиреНрдпрдерд╛ рдХреЙрд▓ рдХрд░реЗрдВред

+1

+1

+1

+1

:+1:

+1

:-1:
рдореБрдЭреЗ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдбреАрдмреА рдЕрдкрдбреЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЕрдиреНрдп рдЖрдЗрдЯрдо рдЬреЛ рдореЗрд░реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЕрдХреНрд╕рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╕реНрдЯрдо рдЖрд╡рд░рдг рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдиреЗрд╡рд▓рд╛ рдЕрдм рд╕рдВрд╕реНрдХрд░рдг 4 рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдХреЛрдИ рднреА рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди v3 рдореЗрдВ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдЕрдиреБрд░реЛрдз рд╣реИ рдХрд┐ рдЗрд╕реЗ v4 рдЪрд░реНрдЪрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ: +1: рдЕрдЧрд░ рдореИрдВ рдПрдХ рд╕реЗрд╡ рдХреЙрд▓ рдкрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореИрдВ рдЕрдХреНрд╕рд░ рдЦреБрдж рдХреЛ рдПрдХ рдиреЗрд╡рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдкрд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдмрд╕ рдПрдХ .save рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ .save рдХрд░рдирд╛ рдПрдХ рдирдИ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпред рд╢рд╛рдирджрд╛рд░ рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рдХреЛ рдкреНрд░рдгрд╛рдоред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред

+1

рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдПрдореНрдмреЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рд╣реИ:

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

рдлрд┐рд░ рдиреЗрд╡рд▓реЗ рдХреА рд╣рд░ рдЕрдкрдбреЗрдЯ рдХреЙрд▓ рдбреЗрдЯрд╛ рдХреА рдЕрдкрдбреЗрдЯреЗрдб рдХреБрдВрдЬреА рдХреЛ рдареАрдХ рдХрд░ рджреЗрдЧреАред

рдЖрдк рдЗрд╕ рдореЙрдбрд▓ рд▓рд┐рдореНрдмреЛ рдХреЛ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдиреЗрд╡рд▓рд╛ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЖрд╡рд░рдг рд╣реИ, рд╕рднреА рд╕реНрдХреАрдорд╛рдУрдВ рдХреЛ рдмрд╛рдЗрдВрдб рд╕реНрдЯреИрдЯрд┐рдХ/рд╡рд┐рдзрд┐/рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЛрдВрдЧреЛрдбрдм рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдкреАрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

+1, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдЬрдмрдХрд┐ рдореИрдВ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдкрд░рдорд╛рдгреБ рдЕрджреНрдпрддрдиреЛрдВ рдкрд░ рд╣реБрдХ рдХреА рдХрдореА IMHO рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдиреЗрд╡рд▓рд╛ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╡реНрдпрд░реНрде рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдкрд░рдорд╛рдгреБ рдЕрджреНрдпрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдХрд┐рд╕реА рднреА рд╕рддреНрдпрд╛рдкрди, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдУрдбреАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреВрд░рд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЦреЛрдЬ/рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдорддреМрд░ рдкрд░ рдореИрдВ рдЦреЛрдЬрдиреЗ/рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИред MongoDB рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд░рдорд╛рдгреБ рдХреНрд╡реЗрд░реА рдФрд░ рдЕрджреНрдпрддрди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рд▓реЗрдирджреЗрди рд╕рдорд░реНрдерди рдХреА рдХрдореА рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрди рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди w/o рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕рдорд░реНрдерди Mongoose рдореВрд▓ MongoClient рдкрд░ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning рдореЗрдВ рдЙрджрд╛рд╣рд░рдг update рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░реЗрдВред рдореИрдВ рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХрд╛ рдареАрдХ рд╕реЗ рдпрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛ рдирд╣реАрдВ рд╕рдХрддрд╛? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕реЗ рд░рдЦрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдореИрдВ рддрдХрдиреАрдХреА рдХрд╛рд░рдгреЛрдВ рдХреЛ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддрд╛: рдпрджрд┐ 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 :)

рд╣рд╛рдБ @neverfox рдЕрдЪреНрдЫрд╛ рдХреИрдЪред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ рдФрд░ рдЖрдк рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ #2262 рдореЗрдВ рдХреНрдпреЛрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ред

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ new рдореЛрдВрдЧреЛрдбрдм рдиреЛрдб рдбреНрд░рд╛рдЗрд╡рд░, рдореЛрдВрдЧреЛрдбрдм рд╢реЗрд▓, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдВрдЧреЛрдбрдм рд╕рд░реНрд╡рд░, рдЖрджрд┐ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд░реИрдкрд░ рдкрд░рддреЗрдВ рджреЗрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдХрдард┐рди рдмрдирд╛рддреА рд╣реИрдВред рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдореЗрд░рд╛ рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЗрд╕ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ gulp-uglify , рдЬреЛ uglify-js рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рд╣реЛ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 4.0.2 рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореМрдЬреВрдж рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЕрд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИ? рдпрд╣ 4.0.2 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде Scema.pre('update') рдпрд╛ Schema.pre('findOneAndUpdate') рдХреЗ рд╕рд╛рде findOneAndUpdate рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИ?

рдЖрдк рдкреНрд░реА-рд╣реБрдХ @CaptainStaplerz рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдХреНрдпрд╛ FindOneAndUpdate рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реБрдХ 4.0.2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 3.8 рд╕реЗ рдирд╡реАрдирддрдо рдиреЗрд╡рд▓рд╛ 4.0.2 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ Document.schema.post('findOneAndUpdate', function (doc) рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕реЗ save() рдпрд╛ remove() рдХрд░рддрд╛ рд╣реИ

@honitus рдореБрдЭреЗ рдЕрдкрдирд╛ рдХреЛрдб рджрд┐рдЦрд╛рдУ

@vkarpov15 - рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рд░рд╣рд╛

рдмреНрд▓реЙрдЧ рдирд┐рдпрдВрддреНрд░рдХ, рдЬреЗрдПрд╕

// 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);
      }
   );

}

blog.socket.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 рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рджрд┐рдирд╛рдВрдХ.рдЕрдм() рднрд╛рдЧ рд╣реИ рдЬреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗ рд░рд╣рд╛ рд╣реИ?

@vkarpov15
рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ #964 рдЬреЛрдбрд╝реЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди https://github.com/Automattic/mongoose/commit/e98ef98e857965c4b2ae3339fdd7eefd2a5a9913

рдпрд╣ рдЕрдм рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд┐рдХреНрд╕ рдореБрдЦреНрдп рдореЗрдВ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

@honitus рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдк рдиреЗрд╡рд▓рд╛ 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('remove'); рдХреЛрдгреАрдп рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕реНрдЯрдмреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ
рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рд╛ #964 e98ef98
рдореИрдВрдиреЗ рдмрд╕ рдЗрддрдирд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдиреАрдЪреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ
this._schema.s_.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,
рд▓рд╛рдЗрди 1526 рдХреЛ 4.0.2 рдореЗрдВ рджреЗрдЦреЗрдВ - this.model.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,

рд▓рд╛рдЗрди 1526 рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ- this.schema.s.hooks.wrap('findOneAndUpdate', Query.base.findOneAndUpdate,
рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╡рд╣ рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред рдореЙрдбрд▓ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдиреЗрд╡рд▓рд╛ рдХреЛ рд╕реНрдХреАрдорд╛ рд╣реБрдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП (рдЕрд░реНрдерд╛рдд, mongoose.model() рдХреЙрд▓), рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@ vkarpov15 рдореИрдВ рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдпрд╣ рдПрдХ рдмреЗрд╡рдХреВрдл рдЯрд╛рдЗрдкреЛ рдпрд╛ рдХреБрдЫ рдФрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛:

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

рд╣рд╛рд▓рд╛рдВрдХрд┐ 'рдпрд╣' рдЕрджреНрдпрддрди рдореЙрдбрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ 'рд╕реЗрд╡' рд╣реБрдХ рдореЗрдВ рдХрд░рддрд╛ рд╣реИ?), рдЬрд┐рд╕рд╕реЗ 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();
                }
            });
        }
    });

});

рдореЗрд░реЗ рдкрд╛рд╕ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдореЙрдбрд▓ рдкрд░ рдПрдХ рдФрд░ рдкреНрд░реА-рд╣реБрдХ рд╣реИред рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░реА-рд╕реЗрд╡ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде, рдпрд╣ рдмрд╕ рд╣реБрдХ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред рдореИрдВрдиреЗ findOneAndUpdate рдЖрджрд┐ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ... рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреВрд░реЗ рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдЖрдк рд▓реЛрдЧ рд╡рд╣рд╛рдВ рднреА рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ CompanyAvatarSchema рдФрд░ CompanyDetails рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рд╕рдВрдмрдВрдз рд╣реИ?

рдХрдВрдкрдиреА рд╡рд┐рд╡рд░рдг рдореЗрдВ CompanyAvatar.schema рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рди рдХреЗрд╡рд▓ рдкреНрд░реА-рд╣реБрдХ рдмрд▓реНрдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреЛ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкреВрд░реНрд╡-рд╣реБрдХ рджреЛрдиреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рдЧреБрдЧрд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдпрд╣ рднреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдЬрдм рдореИрдВ рд╕рд┐рд░реНрдл рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреНрд╡реЗрд░реА рдХреЛ рдирдП рдЙрд░реНрдл тАЛтАЛрд╡рд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ = рдирдП рдорд╛рддрд╛-рдкрд┐рддрд╛ () рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЖрдк CompanyDetails.update() рдкрд░ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдкреНрд░реА рд╣реБрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдХреАрдорд╛ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрд╡реЗрд░реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреАрдорд╛ рдХреЗ pre('update') рдПрдЯреАрдПрдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ 'рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ' рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдпрд╣рд╛рдВ рдореЗрд░реА рдХрдВрдкрдиреА рдЕрд╡рддрд╛рд░ рд╕реНрдХреАрдорд╛ рд╣реИ рдЬреЛ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкреНрд░реА-рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╣реИ рдЬреЛ рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ (рдЕрд╡рддрд╛рд░ рдлреЛрдЯреЛ) рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

'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_details рд╕реНрдХреАрдорд╛ рд╣реИ рдЬрд╣рд╛рдБ company_avatar рдПрдХ рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИ:

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],

    }
});

рдФрд░ рдпрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдЕрд╡рддрд╛рд░рдкрд╛рде рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕ рдЕрдкрдбреЗрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рдиреНрдп/рд╣реБрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

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 рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рд╣реБрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реА ('findOneAndUpdate') рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреАрдорд╛ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрднреА, рдиреЗрд╡рд▓рд╛ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП CompanyDetailsSchema рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: #3125

+1

@ vkarpov15 рдореБрдЭреЗ рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛

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

рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рдХрдард┐рди рдореВрд▓реНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХреИрд╕реЗ рдкрдврд╝реВрдВ рдФрд░ рдмрджрд▓реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╣реИрд╢?

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

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХреЗрд╕ рд╣реИ, рд╣реИ рдирд╛? рдпрд╛ рдХреНрдпрд╛ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдвреВрдВрдврддреЗ рд╣реИрдВ() рдФрд░ рдлрд┐рд░ рд╕реЗрд╡() рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ?

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();
});

рдФрд░ рдЕрдЧрд░ рдореИрдВ this рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ

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

рдЬреЛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ (рдФрд░ рдореИрдВрдиреЗ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реАрдзреЗ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛) рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реИрд╢реЗрдб рдорд╛рди рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ 'рдХрдЪреНрдЪрд╛' рдорд╛рди рд▓рд┐рдЦрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╡рд╣ рдЕрдЬреАрдм рд╣реИред рдЖрдк require('mongoose').set('debug', true); рдХреЗ рд╕рд╛рде рдиреЗрд╡рд▓рд╛ рдбреАрдмрдЧ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбреАрдмреА рдХреЛ рдЬреЛ рдХреНрд╡реЗрд░реА рднреЗрдЬреА рдЬрд╛ рд░рд╣реА рд╣реИ, рд╡рд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреА рд╣реИред

рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдпреЗ рдзрдиреНрдпрд╡рд╛рджред рдмрд╕ рдпрд╣реА рдХрд┐рдпрд╛:

рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

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

рдЬреЛ рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛рддрд╛ рд╣реИ

{ '$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() рдмреЗрд╣рддрд░ рдЖрдИрдПрдордУ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛ рдЖрдк рдмрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

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();
});

рдпрд╣ рд╣рд░ рдЕрдкрдбреЗрдЯ () рдХреЙрд▓ рдкрд░ рдкрд╛рд╕рд╡рд░реНрдб рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ред рддреЛ рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдиреНрдп рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ, рдпрд╛рдиреА рдирд╛рдо рдпрд╛ рдЙрдореНрд░ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╛рд╕рд╡рд░реНрдб рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ !?

@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() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)
рдкреНрд░рд╢реНрди рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ totalNumberOfComments рдлрд╝реАрд▓реНрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ findOneAndUpdate рдХрд╛ рдореВрд▓ рдЕрдкрдбреЗрдЯ рднреА рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

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();
});

рдореИрдВ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рд╣реБрдХ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ред

`рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = рдлрдВрдХреНрд╢рди (рдиреЗрд╡рд▓рд╛) {
var mySchema = mongoose.Schema({
рдЖрдИрдбреА: {рдкреНрд░рдХрд╛рд░: рд╕рдВрдЦреНрдпрд╛, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛: {рдЕрджреНрд╡рд┐рддреАрдп: рд╕рддреНрдп}},
рдлрд╝реАрд▓реНрдб 1: {рдкреНрд░рдХрд╛рд░: рд╕реНрдЯреНрд░рд┐рдВрдЧ},
рдлрд╝реАрд▓реНрдб 2: {рдкреНрд░рдХрд╛рд░: рд╕реНрдЯреНрд░рд┐рдВрдЧ}
}, {
рд╕рдВрдЧреНрд░рд╣: "рдорд╛рдИрд╕реНрдХреАрдорд╛",
рд╕рдВрд╕реНрдХрд░рдгрдХреБрдВрдЬреА: рдЕрд╕рддреНрдп
});

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

}`

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

рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ {id:1, рдлрд╝реАрд▓реНрдб1: 'рдкрд░реАрдХреНрд╖рдг') рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди {id: 1, рдлрд╝реАрд▓реНрдб1: 'рдкрд░реАрдХреНрд╖рдг', рдлрд╝реАрд▓реНрдб2:'рдирдпрд╛ рдорд╛рди'} рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐ рдореБрдЭрд╕реЗ рдХреМрди рд╕реА рдЧрд▓рддреА рд╣реЛ рд░рд╣реА рд╣реИ

рдореИрдВ рдРрд╕рд╛ рдХрд░рдХреЗ findOneAndUpdate рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реВрдВ
mySchema.post('findOneAndUpdate', function (result) { result.field2 = 'something' });

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдЙрд╕ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рдЬреЛ рдореЙрдбрд▓ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рдЪреБрди рд░рд╣реЗ рд╣реИрдВред рдЕрдкрдиреЗ mySchema.post рдореЗрдВ "рдпрд╣" рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдореЗрдВ рдХрд┐рдпрд╛() рдпрд╛ рдЕрдЧрд▓рд╛() рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдореЙрдбрд▓ рдореЗрдВ рдореМрдЬреВрджрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ?

рдпрд╣ рдПрдХ рдХреНрд╡реЗрд░реА рд╡рд╕реНрддреБ рд╣реИ

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯ рд╣реБрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдпрд╛ рдЕрдЧрд▓рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╡реИрд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ this.model.update рд╣реИ рдЬреЛ рд╕реНрдХреАрдорд╛ рд╣реИ рди рдХрд┐ рд╡рд╕реНрддреБ рдХрд╛ рдореЙрдбрд▓ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ.. рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

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

рдпрд╣ рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдореЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдХреА рдУрд░ рд▓рдЧрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЖрдк рдХреЗрд╡рд▓ "рдЗрд╕" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ findOneAndUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдЙрд╕рдХреЗ рдКрдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ

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

рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред_рдЕрдкрдбреЗрдЯ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЕрдкрдбреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдерд╛ рдЬрд┐рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдореИрдВрдиреЗ $ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдореЗрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдкреНрд░реА рдФрд░ рдкреЛрд╕реНрдЯ рд╣реБрдХ рдХрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рдорд┐рдбрд▓рд╡реЗрдпрд░ рдбреЙрдХреНрд╕ http://mongoosejs.com/docs/middleware.html

+1

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

efkan picture efkan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

adamreisnz picture adamreisnz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

simonxca picture simonxca  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeremyml picture jeremyml  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

AraanBranco picture AraanBranco  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ