如何在mongoose中创建自增字段

4

有人能告诉我如何在mongoose中创建自增字段而不使用任何库或插件吗?有简单易行的方法吗?


请查看以下内容: https://dev59.com/GV4c5IYBdhLWcg3wEGt_#30164636 - Chandan Rai
2个回答

4

使用Mongoose pre-save函数可以非常简单和容易地实现Mongoose中的自动增量。以下是我的用户集合代码,您可以在您的Mongoose模型(schema)中尝试同样的技巧来实现自动增量。将此代码粘贴到您的集合模式文件中,并根据您的集合模式替换一些变量(userSchema,user)。

userSchema.pre('save', function(next) {
    var currentDate = new Date();
    this.updated_at = currentDate;

    if (!this.created_at)
        this.created_at = currentDate;

    var sno = 1;
    var user = this;
    User.find({}, function(err, users) {
    if (err) throw err;
        sno = users.length + 1;
        user.sno = sno;
        next();
    });
});

这不是一个有效的解决方案。如果从中间删除条目,那么将会有多个条目具有相同的ID,因为您正在获取文档的长度并增加1。https://dev59.com/GV4c5IYBdhLWcg3wEGt_ - Shihab
在我的情况下,我正在使用软删除功能,因此不会发生这种情况。 - Utkarsh Pandey
我正在添加另一个答案,为您提供更多的解决方案。 - Utkarsh Pandey

2
如果您正在使用软删除功能,则上面的答案可能有效,但要解决此问题,有几种方法。 1:在插入新记录之前获取最后一个文档/行,并将id = 1 +(最后一条记录的id)。 2:您可以使用插件mongoose-auto-increment。 3:最后一个选择是将最后增加的值保存在单独的集合中(集合名称:autoIncrement,列为collection和sno),在创建记录之前获取该集合的sno值并将其递增,创建您的记录,然后再次在autoIncrement集合中更新sno值。
奖励: 1:您可以在redis中创建自动递增。 2:上述答案的第一点无法解决多个问题,即:如果用户从集合的开头或中间删除行,则应用程序将执行某种行为,它将删除该ID(来自表格的sno),但是如果用户删除了最后一条记录。它将把那个sno放到下一条记录中。
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();
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接