为任何更新查询增加 Mongoose 文档版本的简单方法?
Easy way to increment Mongoose document versions for any update queries?
我想开始利用 Mongooses 文档版本控制(__v 键)。我在实际增加版本值时遇到问题,然后我发现在执行查询时必须添加 this.increment()
。
有没有办法自动递增?现在,我只是将它添加到 pre 中间件以进行更新类型查询:
module.exports = Mongoose => {
const Schema = Mongoose.Schema
const modelSchema = new Schema( {
name: Schema.Types.String,
description: Schema.Types.String
} )
// Any middleware that needs to be fired off for any/all update-type queries
_.forEach( [ 'save', 'update', 'findOneAndUpdate' ], query => {
// Increment the Mongoose (__v)ersion for any updates
modelSchema.pre( query, function( next ) {
this.increment()
next()
} )
} )
}
这似乎有效..但我有点认为在 Mongoose 中已经有一种方法可以做到这一点..我错了吗?
我会说这是要走的路。 pre中间件恰好符合这个需求,其他的我也不知道。事实上,这就是我在所有模式中所做的。
您需要注意的是 document 和 query 中间件之间的区别。
Document 中间件针对 init
、validate
、save
和 remove
操作执行。那里,this
指的是文件:
schema.pre('save', function(next) {
this.increment();
return next();
});
Query 中间件针对 count
、find
、findOne
、findOneAndRemove
、findOneAndUpdate
和update
操作。其中,this
指的是查询对象。更新此类操作的版本字段如下所示:
schema.pre('update', function( next ) {
this.update({}, { $inc: { __v: 1 } }, next );
});
对我来说,最简单的方法是:
clientsController.putClient = async (req, res) => {
const id = req.params.id;
const data = req.body;
data.__v++;
await Clients.findOneAndUpdate({ _id: id }, data)
.then( () =>
{
res.json(Ok);
}
).catch ( err => {
Error.code = '';
Error.error = err;
res.json(Error);
})
};
我想开始利用 Mongooses 文档版本控制(__v 键)。我在实际增加版本值时遇到问题,然后我发现在执行查询时必须添加 this.increment()
。
有没有办法自动递增?现在,我只是将它添加到 pre 中间件以进行更新类型查询:
module.exports = Mongoose => {
const Schema = Mongoose.Schema
const modelSchema = new Schema( {
name: Schema.Types.String,
description: Schema.Types.String
} )
// Any middleware that needs to be fired off for any/all update-type queries
_.forEach( [ 'save', 'update', 'findOneAndUpdate' ], query => {
// Increment the Mongoose (__v)ersion for any updates
modelSchema.pre( query, function( next ) {
this.increment()
next()
} )
} )
}
这似乎有效..但我有点认为在 Mongoose 中已经有一种方法可以做到这一点..我错了吗?
我会说这是要走的路。 pre中间件恰好符合这个需求,其他的我也不知道。事实上,这就是我在所有模式中所做的。
您需要注意的是 document 和 query 中间件之间的区别。
Document 中间件针对 init
、validate
、save
和 remove
操作执行。那里,this
指的是文件:
schema.pre('save', function(next) {
this.increment();
return next();
});
Query 中间件针对 count
、find
、findOne
、findOneAndRemove
、findOneAndUpdate
和update
操作。其中,this
指的是查询对象。更新此类操作的版本字段如下所示:
schema.pre('update', function( next ) {
this.update({}, { $inc: { __v: 1 } }, next );
});
对我来说,最简单的方法是:
clientsController.putClient = async (req, res) => {
const id = req.params.id;
const data = req.body;
data.__v++;
await Clients.findOneAndUpdate({ _id: id }, data)
.then( () =>
{
res.json(Ok);
}
).catch ( err => {
Error.code = '';
Error.error = err;
res.json(Error);
})
};