次ã®ã³ãŒããåæžããããã«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ãäœæããŠãããã¹ãããã«ãŠã§ã¢ã¯å®è¡ãããŸããã
æå³çã«ã ããã¯ãåŒã³åºãããã®ããã¥ã¡ã³ãããããŸãã
èšæ£ãããã¯ãåŒã³åºãããã®ããã¥ã¡ã³ãã¯ãããŸããã
ããïŒ preãpostããã«ãŠã§ã¢ãåŒã³åºãããå Žåã¯ãæåã®ã¢ãããŒãã䜿çšããå¿ èŠããããŸããïŒ
ã¯ããããã¯æ£ããã§ãã Model.updateãfindByIdAndUpdateãfindOneAndUpdateãfindOneAndRemoveãfindByIdAndRemoveã¯ãããŒã¿ããŒã¹ã§çŽæ¥å®è¡ããããã¹ãŠã®ã³ãã³ãã§ãã
ããã¯ã¬ã€ãã§æ確ã«èª¬æããå¿
èŠããããŸããç¹ã«ãåãããŒãžã§æ€èšŒã«ã€ããŠè©±ããŠããŠã findByIdAndUpdate
ããããè¯ãããšèª¬æããŠããå Žåã¯ããã§ãã
ãããè¯ãããªã³ã¯ãã¯ãªãã¯ãããšãã®å®å
šãªããã¥ã¡ã³ãã«ç§»åããŸãã
æ€èšŒãªã©ã説æããæ¹æ³ã
ãã«ãªã¯ãšã¹ããéä¿¡ããŠãããè¯ããšæããã®ãè¿œå ããŠãã ããã ããã¯
ããããã®ã¯ãšãŠãç°¡åã§ãïŒ
https://github.com/LearnBoost/mongoose/blob/master/CONTRIBUTING.md
2012幎10æ31æ¥æ°Žææ¥ååŸ6æ3åãJesse [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ïŒ
æ©èœèŠæ±ãåãåããŸãããããã«ãŠã§ã¢ã䜿çšããæéãé·ããªããšãããŒã¿ããŒã¹æŽæ°ã¹ã¯ãªãããéåžžã®æäœã§ã¯æ¥åžžçã§ã¯ãªããã®ä»ã®é
ç®ãåŒã³åºããšãã«ãããã«ãŠã§ã¢ãé »ç¹ã«ãã€ãã¹ããå¿
èŠããããŸãã éçã¡ãœããã䜿çšããããšã«ãããäžèšã®æ©èœèŠæ±ããã§ã«å®è£
ããŠããã«ã¹ã¿ã ã©ãããŒãéåžžã«ç°¡åã«äœæã§ããŸãã ãã³ã°ãŒã¹ã¯çŸåšããŒãžã§ã³4ã®ã¢ã€ãã¢ãåãå
¥ããŠããããããã®èŠæš¡ã®APIã®å€æŽãv3ã§çºçããå¯èœæ§ã¯ã»ãšãã©ãããŸããã ãããv4ãã£ã¹ã«ãã·ã§ã³ã«ç§»ããŠãã ããã
ãã ããä¿ååŒã³åºãã§ããã«ãŠã§ã¢ãç¡å¹ã«ã§ããå Žåã¯ãïŒ+ 1ïŒã«ãªããŸãã å¥ã®é¢æ°ããæž¡ããããã³ã°ãŒã¹ãªããžã§ã¯ããèŠã€ããŠãåã«.saveãå®è¡ãããããšããããããŸãããã®ç¶æ³ã§ã¯ãæ°ããã¯ãšãªãäœæããããã.saveãå®è¡ããæ¹ãæãŸããã§ãã ãããå¯èœã§ããã°ããããææããŠãã ãã
ãããã«ãããçŽ æŽãããã©ã€ãã©ãªã çŽ æŽãããã¡ã³ãããžã®ç§°è³ã ãããªãã§ç§ãã©ã®ããã«åäœãããããããŸããã
+1
ãããã®ã¡ãœããã®ããã¯ãè¿œå ããç°¡åãªæ¹æ³ã¯ãåã蟌ã¿é¢æ°ãäžæžãããããšã§ãã
_update = UserModel.update
UserModel.update = (conditions, update) ->
update.updatedAt or= new Date
_update.apply this, arguments
ãã®åŸãmongooseãåŒã³åºããã³ã«ãããŒã¿ã®updatedAtããŒãä¿®æ£ãããŸãã
ãã®ã¢ãã«ã®ãªã³ããè©ŠããŠã¿ãŠãã ããã ããã¯ãã³ã°ãŒã¹ã¢ãã«ã®åçŽãªã©ãããŒã§ããããã¹ãŠã®ã¹ããŒããžã®éç/ã¡ãœãã/äžæžãã®ãã€ã³ãããµããŒãããrpcã¡ãœãããåŒã³åºããŠmongodbãã¯ãšãªããŸãã
+1ããã®æ©èœãå¿ èŠã§ã...
ç§ã¯ãã®çç±ãããçšåºŠç解ããŠããŸãããã¢ãããã¯æŽæ°ã®ããã¯ããªããããå®éã«ã¯Mongooseã¯ããç¡æå³ã«ãªã£ãŠããŸãã ã¢ãããã¯æŽæ°ã䜿çšãããšãæ€èšŒãããã©ã«ããªã©ãå®è¡ãããªããããODMã䜿çšããç®çå šäœãç¡å¹ã«ãªããŸãã æ€çŽ¢/ä¿åã䜿çšãããšæ©èœããŸããããããåžžã«äœ¿çšããããšããä¿èšŒã¯ãããŸããïŒ
ããã«ãéåžžãäžå¯åæäœã§ã¯ãªããããæ€çŽ¢/ä¿åã¯é¿ããããšããŸãã MongoDBã¯ã匷åãªã¢ãããã¯ã¯ãšãªããã³æŽæ°æ©èœãæäŸããããšã«ããããã©ã³ã¶ã¯ã·ã§ã³ãµããŒãã®æ¬ åŠãè£ããŸãã ãããã£ãŠããããã®ã¢ãããã¯æäœã䜿çšããŸãããããã«ãŠã§ã¢ã®ãµããŒãããªãå Žåã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 use 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
äžæ©é ããŠããããã§ãã ç§ã¯äœãæ¬ ããŠããŸããïŒ
AHã new
ãã©ã°ã®ããã©ã«ãã®é倧ãªå€æŽã åºç€ãšãªããã©ã€ããŒãšã®äžè²«æ§ã«ã€ããŠã¯äœãèšãããããšããããŸãããç¹ã«ãã®æ°ããããã¯ãæ€èšããå Žåãããã¯æ¬åœã«çŽæã«åããŠãããšèšããããåŸãŸããã
@neverfox :)
ãã@neverfoxè¯ããã£ããã ãã®å€æŽã¯ãªãªãŒã¹ããŒãã«èšèŒãããŠãããïŒ2262ã§å€æŽãããçç±ã«ã€ããŠè©³ãã説æããŠããŸãã
ãã®çç±ã¯ãmongodbããŒããã©ã€ããŒãmongodbã·ã§ã«ãå®éã®mongodbãµãŒããŒãªã©ã§new
ãããã©ã«ãã§falseã§ãããã©ãããŒã¬ã€ã€ãŒãéæšæºã®ããã©ã«ããèšå®ãããšãéçºè
ã®ç掻ãå°é£ã«ãªãããã§ãã ãããã²ã©ãééã£ãŠããã¢ãžã¥ãŒã«ã®ç§ã®æšæºçãªäŸã¯ã gulp-uglifyã§ããããã¯ãuglify-jsã®ããã©ã«ãã®æããªãŒããŒã©ã€ãããŸãã
åé¡ã¯è§£æ±ºãããŠããããã§ãããããŒãžã§ã³4.0.2ã®æ©èœã¯ãŸã äžå®å®ãªããŒãžã§ã³ã®ãŸãŸã§ããïŒ Scema.preïŒ 'update'ïŒã䜿çšããfindOneAndUpdateãŸãã¯4.0.2ããŒãžã§ã³ã䜿çšããSchema.preïŒ 'findOneAndUpdate'ïŒã§ã¯å®è¡ãããªãããã§ãã é¢æ°ã«æž¡ããªããã°ãªããªããã®ããããŸãããïŒ
ãã¬ããã¯@CaptainStaplerzãã©ã®ããã«å®£èšããŠããŸããïŒ
findOneAndUpdateããã«ãŠã§ã¢ããã¯ã¯4.0.2ã§å©çšã§ããŸããïŒ ããã䜿çšããããã«3.8ããææ°ã®ãã³ã°ãŒã¹4.0.2ã«ã¢ããã°ã¬ãŒãããŸããããmiddlware Document.schema.postïŒ 'findOneAndUpdate'ãé¢æ°ïŒdocïŒãsaveïŒïŒãremoveïŒïŒã®ããã«ããªã¬ãŒãããŸãã
@honitusã¯ããªãã®ã³ãŒããèŠããŠãããŸã
@ vkarpov15-è¿ éãªå¯Ÿå¿ã«æè¬ããŸãã
blog.controllerã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);
}
);
}
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
ã¹ããŒãã¡ã³ããå®è¡ãããŠããã®ã§ããããããããšããäºæããªãçµæãããããã®ã¯Date.nowïŒïŒã®éšåã ãã§ããããã
@ vkarpov15
ãœãŒã¹ã³ãŒããå€æŽããå®è£
ã®è¿œå ïŒ 964httpsïŒ//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'ïŒ; è§åºŠãã«ã¹ã¿ãã¯ã«ãã£ãŠèªåçã«äœæãããã¹ã¿ãã®1ã€ã§ã
å®è£
ïŒ964e98ef98ãè¿œå ããŸãã
äžã«1è¡è¿œå ããã ãã§ã
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ãã¯æŽæ°ãããã¢ãã«ãåç §ããŠããªãããã§ãïŒãã ãããsaveãããã¯ã§ã¯åç §ããŠããŸããïŒïŒããããã£ãŠãthis.updatedAtã¯undefinedãåç §ããŸãã
'findOneAndUpdate'ããã¯ã® '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();
});
});
ã¢ããªã®ä»ã®å Žæã§ããã¥ã¡ã³ããåæåãããšãã«æããã«ãããåŠçã§ããŸããããã¹ãŠãMongooseã«å«ãŸããŠãããšäŸ¿å©ã§ãã ã©ããªèãã§ãæè¿ããŸãïŒ
ãããç§ã¯æ··ä¹±ããŠããŠãããªãã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
}
ãŸããäºåããã¯ã ãã§ãªããæ€èšŒãå®å šã«ç¡èŠãããŸãã ãã®ãµãããã¥ã¡ã³ãã¯å ¥åãããŸãããæ€èšŒãšãã¬ããã¯ã®äž¡æ¹ãç¡èŠããŸãã ç§ã¯ãã¹ãŠãã°ãŒã°ã«ã§æ€çŽ¢ãããããè©ŠããŸããããåäœããç¶ãç®ã¯ãããŸããã ãã¹ãã®ããã«ã¯ãšãªãå€æŽããŠãæ°ããå¥åvar parent = new ParentïŒïŒã§ã¢ãã«ãäœæããŠåŒã³åºããšãæ©èœããŸãã
CompanyDetails.update()
ãåŒã³åºããŠããŸãããpreããã¯ã¯å¥ã®ã¹ããŒãã§å®çŸ©ãããŠããŸãã ã¯ãšãªããã«ãŠã§ã¢ã¯ããã¹ããããã¹ããŒãã®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_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],
}
});
ãããŠããããã¢ããããŒããããã¡ã€ã«ã³ã³ãããŒã©ãŒãšããã®ã¢ããããŒããå®è¡ããåã«æ€èšŒ/ããã¯ããå¿ èŠããã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 } },
ããã¯åé¡ãªãããã«èŠããŸããïŒçŽåã«ãã®ããããã£ãèšå®ããããšããããšããããŸãïŒãæçµçã«ã¯ãããã·ã¥å€ãããŒã¿ããŒã¹ã«æžã蟌ãã®ã§ã¯ãªããåã«ãrawãå€ãæžã蟌ã¿ãŸãã äœãè©Šãããšãã§ããŸããïŒ
å€ã ãã require('mongoose').set('debug', true);
ã䜿çšããŠãã³ã°ãŒã¹ãããã°ã¢ãŒããæå¹ã«ããŠã¿ãŠãããŒã¿ããŒã¹ã«éä¿¡ãããã¯ãšãªãäœã§ãããã確èªããŠãã ããã
ææ¡ãããããšãã ã¡ããã©ãããããŸããïŒ
ç§ã¯ãããå®è¡ããŸãïŒ
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ããããšããä»ã®åé¡ã远跡ããŸãã
@ vkarpov15preããã¯ã§é²è¡äžã®ã¯ãšãªã®ãªãã·ã§ã³ãèšå®ããæ£ããæ¹æ³ã¯æ¬¡ã®ããã«ãªããšæããŸãã
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 = functionïŒmongooseïŒ{
var mySchema = mongoose.SchemaïŒ{
idïŒ{ã¿ã€ãïŒæ°å€ãã€ã³ããã¯ã¹ïŒ{äžæïŒtrue}}ã
field1ïŒ{ã¿ã€ãïŒæåå}ã
field2ïŒ{ã¿ã€ãïŒæåå}
}ã{
ã³ã¬ã¯ã·ã§ã³ïŒãmySchemaãã
versionKeyïŒfalse
}ïŒ;
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ïŒïŒãå«ãŸããŠããªãããã§ãã ç§ã¯ãã®ããŒãã«ã€ããŠããŸãç¥èããããŸãããããããå°å·ããããšã§ãå°ãªããšãããªããäœãæ±ã£ãŠãããã«ã€ããŠã®ã¢ã€ãã¢ãåŸãããããšã¯ç¥ã£ãŠããŸãã
ã¢ãã«å ã®æ¢åã®ããã¥ã¡ã³ããå€æŽããããã®æŽæ°ã®ãã€ã³ãã§ã¯ãããŸãããïŒ
ããã¯ã¯ãšãªãªããžã§ã¯ãã§ã
ç§ãç解ããŠããéãããã¹ãããã¯ã§å®äºããã次ã®ããšããããããå¿ èŠã¯ãããŸããã
ããã¯ããªããžã§ã¯ãã®ã¢ãã«ã§ã¯ãªãã¹ããŒãã§ãã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
æãåèã«ãªãã³ã¡ã³ã
ããã«ã¡ã¯ã
åé¡ã解決ããããšã¯ç¥ã£ãŠããŸãããçãã«å®å šã«æºè¶³ããŠããããã§ã¯ãããŸããã findOneAndUpdateããã³ä»ã®åæ§ã®æäœã®ããã«ãå°ãªããšãä¿ååŸãŸãã¯æŽæ°åŸã®ããã«ãŠã§ã¢ãããã¹ãã§ã¯ãããŸãããïŒ ããã¥ã¡ã³ããè¿ãããã®ã§å€§äžå€«ã®ããã§ãã ãã¬ããã«ãŠã§ã¢ãModel.updateã«ã¯é©ããŠããŸãããç§ã¯åæããŸãã
ããã«ããããµããŒãã§ããã¯ãã®äžéšã®æäœãçŸåšèªèããŠããªãmongoosasticãªã©ã®ãã©ã°ã€ã³ã®æ©èœãå€§å¹ ã«åäžããŸãã
ããã«ãŠã§ã¢ããªãå Žåããã©ã°ã€ã³ã§æŽæ°åŸã®æäœã管çããæ¹æ³ã«ã€ããŠèª°ããèããŠããŸããïŒ
ããããšã