为任何更新查询增加 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 中间件正好适合这种需求,我不知道还有什么其他方法。事实上,这就是我在所有模式中所做的。

您需要注意的是 documentquery 中间件之间的区别。 Document 中间件针对initvalidatesaveremove 操作执行。其中,this 指的是文档:

schema.pre('save', function(next) 
  this.increment();
  return next();
);

查询中间件针对countfindfindOnefindOneAndRemovefindOneAndUpdateupdate 操作执行。其中,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 增加文档版本

找不到 id 并更新和增加子文档 - 返回 null Mongoose/mongoDB

如何在 Mongoose 中增加子文档的属性?

无法使用 mongoose 在 mongodb 中增加字段

有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?