使用猫鼬创建独特的自动增量字段

时间:2014-04-21 14:32:22

标签: node.js mongodb mongoose auto-increment database

给出一个架构:

var EventSchema = new Schema({
    id: {
        // ...
    },
    name: {
        type: String
    },
});

我想让id独特且自动增量。我试图意识到mongodb implementation但是在理解如何在猫鼬中做到这一点时遇到了问题。

我的问题是:在不使用任何插件的情况下在mongoose中实现自动增量字段的正确方法是什么?

6 个答案:

答案 0 :(得分:31)

以下是使用Mongoose实现自动递增字段的一个很好的示例:

var CounterSchema = Schema({
    _id: {type: String, required: true},
    seq: { type: Number, default: 0 }
});
var counter = mongoose.model('counter', CounterSchema);

var entitySchema = mongoose.Schema({
    testvalue: {type: String}
});

entitySchema.pre('save', function(next) {
    var doc = this;
    counter.findByIdAndUpdate({_id: 'entityId'}, {$inc: { seq: 1} }, function(error, counter)   {
        if(error)
            return next(error);
        doc.testvalue = counter.seq;
        next();
    });
});

您应首先从mongodb documentation执行第1步。

答案 1 :(得分:4)

const ModelIncrementSchema = new Schema({
    model: { type: String, required: true, index: { unique: true } },
    idx: { type: Number, default: 0 }
});

ModelIncrementSchema.statics.getNextId = async function(modelName, callback) {
    let incr = await this.findOne({ model: modelName });

    if (!incr) incr = await new this({ model: modelName }).save();
    incr.idx++;
    incr.save();
    return incr.idx;
};


const PageSchema = new Schema({
    id: { type: Number ,  default: 0},
    title: { type: String },
    description: { type: String }
});


PageSchema.pre('save', async function(next) {
    if (this.isNew) {
        const id = await ModelIncrement.getNextId('Page');
        this.id = id; // Incremented
        next();
    } else {
        next();
    }
});

答案 2 :(得分:2)

您可以使用它。 该程序包每次都会为此生成唯一的值。

包裹名称:uniqid

链接:https://www.npmjs.com/package/uniqid

答案 3 :(得分:1)

是的,这是"瘦的"关于那个功能。

您需要在mongo数据库中拥有该集合。如果你愿意,它可以作为并发密钥分配单一事件记录。 Mongo的例子向您展示了如何执行" atomic"获取下一个密钥的操作,并确保即使存在并发请求,也可以保证在没有冲突的情况下返回唯一密钥。

但是,mongodb本身没有实现该机制,它们向您展示了如何做到这一点。它们仅将_id用作唯一文档密钥。我希望这能澄清你的方法。

要扩展这个想法,请继续将mongo建议的实现添加到您定义的Mongoose模型中,正如您已经猜到的那样,在Pre-save或更好的pre-init事件中使用它,以确保您始终生成id在将其保存到mongo之前,请使用收集服务器端。

答案 4 :(得分:0)

其他方法是您可以使用猫鼬提供的外部软件包。

mongoose sequence plugin

mongoose auto increment plugin

答案 5 :(得分:0)

忽略以上所有内容。这是解决方法

YourModelname.find().count(function(err, count){
   req["body"].yourID= count + 1;
      YourModelname.create(req.body, function (err, post) {
        if (err) return next(err);
        res.json(req.body);
      });
    });