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

问题描述 投票:22回答:3

给出一个架构:

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

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

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

node.js mongodb mongoose auto-increment database
3个回答
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
投票

是的,这是该功能的“瘦身”。

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

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

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


0
投票

另一种方法是你可以使用mongoose给出的外部包。

mongoose sequence plugin

mongoose auto increment plugin

© www.soinside.com 2019 - 2024. All rights reserved.