【问题标题】:an auto-increment version in document creation mongoose文档创建猫鼬中的自动增量版本
【发布时间】:2020-11-24 09:25:45
【问题描述】:

我希望在创建新文档时 versionKey (__v) 字段会自动递增。

(或者我应该在架构中使用新字段“版本”而不是 __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);

路由/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') 中间件,但它仍然无法正常工作。

我用对了吗?

【问题讨论】:

  • @turivishal 我看到了那个答案,但我是 Mongo 的初学者,我不知道应该如何使用我正在使用的 '.create' 函数来实现它。我应该在哪里插入 schema.pre("save")?
  • 但是create() 会创建新文档对吗?那为什么要在创建中增加版本?默认情况下将设置为零。

标签: angular mongodb mongoose


【解决方案1】:

自定义 __v 键名

是的,我们可以将 __v 默认键名更改为任何自定义 versionKey

var TemplateSchema = new mongoose.Schema(
  {
    platform: String,
    templateRevision: String,
    tests: [Test.schema]
  },
  { versionKey: 'version' }
);

自动递增版本

下面的中间件会在操作前调用并更新递增的版本,

  • save()this 引用 document 对象时递增
TemplateSchema.pre('save', function(next) {
    this.increment();
    return next();
});
  • updateMany()this引用查询对象时递增
TemplateSchema.pre('updateMany', function(next) {
    this.updateMany({}, { $inc: { version: 1 } });
    return next()
});

同样的方法你可以为其他方法update()updateOne()findOneAndUpdate()findAndModify()等创建中间件。

  • 我们正在处理 Template.js 文件,最后您需要为架构和导出创建一个模型,您已经这样做了。
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

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2017-06-01
    • 2023-03-19
    • 2016-10-06
    • 2016-10-16
    • 2023-03-11
    相关资源
    最近更新 更多