如何创建在MongoDB中插入新记录后将自动递增的字段?

时间:2018-10-23 13:00:55

标签: node.js mongodb mongoose

我正在使用Mongoose和Node.js

模型的架构如下:

let orderSchema = new Schema({
    'product': String,
    'orderNumber': Number,
    'totalPrice': Number,
    'customer': {
        'type': Schema.Types.ObjectId,
        'ref': 'Users'
    });

我想将orderNumber设置为无损整数。

在MongoDB中有什么方法吗?

我不想使用预钩技术

1 个答案:

答案 0 :(得分:1)

您需要创建一个包含计数器和一个plugin的集合,其中包含两个钩子:

  1. schema.pre-获取计数器的当前值
  2. schema.post-保存计数器的新值

计数器架构如下所示:

const conterSchema = new Schema({
  name: String,
  value: Number
});

虽然插件可以这样定义:

function incrementOrderNumber (schema) {
  schema.pre('save', next => {
    CounterModel.findOne({ name: 'orderNumberCounter' })
      .then(counterDoc => counterDoc.toObject())
      .then(({ value}) => {
        this.orderNumber = value;
        next();
      });
  });

  schema.post('save', next => {
    CounterModel.findOneAndUpdate({ name: 'orderNumberCounter' }, { $inc: { value: 1 }}).exec();
  });
}

创建了此类插件功能后,您需要将其插入到架构中:

orderSchema.plugin(incrementOrderNumber);

不要忘记将orderNumberCounter插入counters集合中。

相关问题