我希望在创建新文档时,versionKey(__v)字段将自动递增。
(或者我应该在模式中使用新字段'version'代替__v吗?)
我的应用程序中的架构示例:
Template.js
var mongoose = require('mongoose');
const Test = require('./Test');
var TemplateSchema = new mongoose.Schema({
platform: String,
templateRevision: String,
tests: [Test.schema]
});
TemplateSchema.pre('save', function(next) {
this.increment();
return next();
});
module.exports = mongoose.model('Template', TemplateSchema);
routes / templatesApi.js
// create new template document
router.post('/', function(req, res, next) {
Test.create(req.body, function (err, tests) {
if (err) {
console.log(err);
return next(err);
}
res.json(tests);
});
});
在哪里以及如何在此处为versionKey属性插入自动递增操作?
编辑:我尝试使用.pre('save')
中间件,但仍然无法正常工作。
我使用得对吗?
答案 0 :(得分:0)
是的,我们可以将__v
的默认键名称更改为任何自定义的versionKey
var TemplateSchema = new mongoose.Schema(
{
platform: String,
templateRevision: String,
tests: [Test.schema]
},
{ versionKey: 'version' }
);
下面的中间件将在操作之前调用并更新增量版本,
save()
,this
引用文档对象TemplateSchema.pre('save', function(next) {
this.increment();
return next();
});
updateMany()
,this
引用 query 对象时TemplateSchema.pre('updateMany', function(next) {
this.updateMany({}, { $inc: { version: 1 } });
return next()
});
使用相同的方法可以为其他方法update()
,updateOne()
,findOneAndUpdate()
,findAndModify()
等创建中间件。
module.exports = mongoose.model('Template', TemplateSchema);
const Template = require('./Template'); // manage path of Template.js
let doc = Template.findOne({ _id: "5f299bdbf045394388fc1461" });
doc.platform = "test platform";
doc.save(); // before this, `save` middleware will call and auto increment version by 1
Template.updateMany(
{ platform: "test platform" },
{ $set: { platform: "demo platform" } }
);
// before this, `updateMany` middleware will call and increment version by 1