node.js - Mongoose upsert does not create default schema property -
example document schema:
var companyschema = schema({ created: { type: date, default: date.now }, modified: { type: date, default: date.now }, address: { type: string, required:true }, name: { type: string, required:true } }); i'm using common request handler edit , create of "company" documents:
exports.upsert = function(req, res) { helper.sanitizeobject(req.body); var company = { name: req.body.name, address: req.body.address }; var id = req.body.id || new mongoose.types.objectid(); var queryoptions = { upsert: true }; company.findbyidandupdate(id, company, queryoptions).exec(function(error, result) { if(!error) { helper.respondwithdata(req, res, { data: result.tojson() }); } else { helper.respondwitherror(req, res, helper.getormerror(error)); } }); }; but using method, when new document inserted, created, modified properties not saved default values of date.now. can call company.create depending on existence of id i'm wondering why upsert not use default values if property not exist on new document?
i'm using mongoose version ~3.8.10,
what's going on none of mongoose's validation, middleware, or default values used when calling of "update" family of methods, findbyidandupdate. they're invoked calls save or create.
the reason "update" calls pass-throughs native driver, mongoose providing type-casting of fields based on schema definition.
mongoose 4.0 update
mongoose supports setting defaults when new document created during update, findoneandupdate, or findbyidandupdate upsert. set setdefaultsoninsert option true enable this. uses $setoninsert operator create defaults on insert.
var queryoptions = { upsert: true, setdefaultsoninsert: true }; company.findbyidandupdate(id, company, queryoptions).exec( ...
Comments
Post a Comment