示例文档模式:
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 }
});我使用一个通用的请求处理程序来编辑和创建"Company“文档:
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));
}
});
};但是使用此方法时,当插入新文档时,created、modified属性不会使用默认值Date.now保存。现在,我可以根据id的存在来调用Company.create,但是我想知道,如果新文档上不存在属性,为什么upsert不使用默认值呢?
我用的是猫鼬版本~3.8.10
发布于 2014-09-10 14:15:42
所发生的事情是,在调用任何方法“更新”系列(如findByIdAndUpdate )时,都不使用Mongoose的验证、中间件或默认值。它们只通过调用save或create来调用。
原因是"update“调用实际上是传递给本机驱动程序的,Mongoose只提供基于模式定义的字段类型转换。
Mongoose 4.0更新
猫鼬现在支持在update、findOneAndUpdate或findByIdAndUpdate重新插入期间创建新文档时设置默认设置。将setDefaultsOnInsert选项设置为true以启用此选项。这将使用$setOnInsert运算符在insert上创建默认值。
var queryOptions = {
upsert: true,
setDefaultsOnInsert: true
};
Company.findByIdAndUpdate(id, company, queryOptions).exec( ...发布于 2014-11-24 04:42:47
您可以使用{ "$setOnInsert": { value: 31 } } 文档
参考文献:https://groups.google.com/forum/#!topic/mongoose-orm/WuJSqxPX8T8
语法:findOneAndUpdate([query], [doc], [options], [callback]) 文档
示例:
model.findOneAndUpdate(
{ username: 'john' },
{ "$setOnInsert": { points: '0' },
$push: {
"boards": {
"account":req.body.account,
"game":req.body.game
}
}
{ upsert: true},
function(err, doc) {
});https://stackoverflow.com/questions/25755521
复制相似问题