为任何更新查询增加 Mongoose 文档版本的简单方法?
Posted
技术标签:
【中文标题】为任何更新查询增加 Mongoose 文档版本的简单方法?【英文标题】:Easy way to increment Mongoose document versions for any update queries? 【发布时间】:2016-05-19 05:28:17 【问题描述】:我想开始利用 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()
)
)
这似乎可行..但我有点认为猫鼬中已经有一种方法可以做到这一点..我错了吗?
【问题讨论】:
【参考方案1】:我会说这是要走的路。 pre 中间件正好适合这种需求,我不知道还有什么其他方法。事实上,这就是我在所有模式中所做的。
您需要注意的是 document 和 query 中间件之间的区别。
Document 中间件针对init
、validate
、save
和remove
操作执行。其中,this
指的是文档:
schema.pre('save', function(next)
this.increment();
return next();
);
查询中间件针对count
、find
、findOne
、findOneAndRemove
、findOneAndUpdate
和update
操作执行。其中,this
指的是查询对象。更新此类操作的版本字段如下所示:
schema.pre('update', function( next )
this.update(, $inc: __v: 1 , next );
);
来源:mongoose documentation。
【讨论】:
所以你是说我必须在文档更新方法 (save
) 和查询更新方法 (findOneAndUpdate
, update
) 之间拆分 __v
增量? this 之类的东西?
是的,您必须在文档和查询中间件之间拆分增量。我建议使用 2 种不同的方法,如我的帖子中所示,而不是试图在一个方法中压缩 2 种不同的方法。
仅供参考@Antoine,Query MW 函数需要next
回调,我从this thread 中发现了它。我更新了你的帖子
出于某种原因,如果我将next
放在查询更新旁边,它会以 2 步递增【参考方案2】:
对我来说最简单的方法是:
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);
)
;
【讨论】:
以上是关于为任何更新查询增加 Mongoose 文档版本的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本