我有以下mongoose.model('quotes')美元的型号:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var quotesSchema = new Schema({
    created: { type: String, default: moment().format() },
    type: { type: Number, default: 0 },
    number: { type: Number, required: true },

    title: { type: String, required: true, trim: true},
    background: { type: String, required: true },

    points: { type: Number, default: 1 },
    status: { type: Number, default: 0 },
    owner: { type: String, default: "anon" }
});

var settingsSchema = new Schema({
    nextQuoteNumber: { type: Number, default: 1 }
});

// Save Setting Model earlier to use it below
mongoose.model('settings', settingsSchema);
var Setting = mongoose.model('settings');

quotesSchema.pre('save', true, function(next) {
  Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
    if (err) { console.log(err) };
    this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
    next();
  });
});

mongoose.model('quotes', quotesSchema);

对于mongoose.model('settings'),还有一个额外的模式,用于存储递增的唯一索引Quote.number的递增数字.在每次保存之前,调用quotesSchema.pre('save')来读取、增加nextQuoteNumber,并将其作为this.number传递给相应的next()函数.

然而,在其他地方保存Quote时,整个.pre('save')函数似乎不会触发.Mongoose中止保存,因为number是必需的,但没有定义,而且我写入函数的console.log()从未输出任何内容.

推荐答案

使用pre('validate')而不是pre('save')来设置必填字段的值.Mongoose会在保存文档之前验证文档,因此如果存在验证错误,将不会调用save中间件.将中间件从save切换到validate将使您的函数在验证之前设置数字字段.

quotesSchema.pre('validate', true, function(next) {
  Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) {
    if (err) { console.log(err) };
    this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next
    next();
  });
});

Mongodb相关问答推荐

MongoDB Aggregate-如何在条件中替换字符串中的变量

最有效的Mongo聚合来展开和过滤:匹配、展开、匹配与投影和过滤

执行聚合以消除重复并获得唯一计数

Mongo 聚合查找 $gte 6 个月前的日期,以DD-MM-YYYY格式存储为字符串

mongo如何通过聚合加载嵌套文档

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

(MongoDB)在同一管道中结合联合和交集

mongoose中的 required是什么意思?

MongoError:$subtract 累加​​器是一元运算符

Mongoexport 在日期范围内使用 $gt 和 $lt 约束

MongoDB获取聚合查询的executionStats

使用 MongoDB 进行分页

升级mongodb

spring-data-mongo - 可选查询参数?

如何使用原子操作在一个文档中切换布尔字段?

请按语法排序 Mongoid Scope

Node + Mongoose:获取最后插入的 ID?

MongoError:Topology is closed, please connect despite established database connection

如何在 Rails 中混合使用 mongodb 和传统数据库?

带有条件的MongoDB聚合查找