在MongoDB模式中使用前导0自动递增字段

时间:2014-06-17 19:25:32

标签: node.js mongodb mongoose

我正在为发票实施MongoDB架构。

我想知道如何增加插入时的id字段?

问题是我需要id才能领先0。

例如,系统中的第一张发票应具有以下ID:

  

0000001

我需要这个能够向用户显示发票序列号。

var InvoiceSchema = new Schema({
/*  invoiceId: {
    type: Number
  },
*/ 
  created: {
    type: Date,
    default: Date.now,
  },
  status: {
    type: String,
    enum: ['Paid', 'Unpaid']
  },
  net: {
    type: Number
  },
  vat: {
    type: Number
  },
  total: {
    type: Number
  },
  products: [{
    product: {
      type: String,
      default: '',
      trim: true
    },
    description: {
      type: String,
      default: '',
      trim: true
    },   
    quantity: {
      type: Number
    },
    unitCost: {
      type: Number
    },
    vat: {
      type: Number
    },
    total: {
      type: Number
    }
  }],
  billingDetails: [BillingDetails],
  user: {
    type: Schema.ObjectId,
    ref: 'User',
    required: true
  }
});

2 个答案:

答案 0 :(得分:4)

有一个名为mongoose-auto-increment的插件(我还没有使用过)可以处理自动增量。

如果您想针对这种特定情况自行编码,可以按照MongoDb tutorial进行编写,这似乎非常简单。

应该是这样的:

var InvoiceSchema = new Schema({..})
InvoiceSchema.pre('save', function (done) {
  if (this.isNew){ //new Record => create
    //this function is the one that should do the FindAndModify stuff
    getNewId(function(autoincremented_id){
      this.id=autoincremented_id;
      done()
    })
  }else{
    done()
  }
});

对于领先的0,我建议使用虚拟。让我们假设你想要7个数字:

InvoiceSchema.virtual('formattedId').get(function () {
  return ("0000000"+this.id).slice(-7);
});
InvoiceSchema.virtual('formattedId').set(function (arg_id) {
  this.id = parseInt(arg_id);
});

答案 1 :(得分:0)

据我所知,mongo不支持自动增量。但你可以做小动作。 当您插入项目时,您使用FgtndAndModify查询并将新ID存储在其他集合中。例子是posted on mongodb blog