Node.js 使用mongoose创建唯一的自动增量字段

Node.js 使用mongoose创建唯一的自动增量字段,node.js,mongodb,mongoose,auto-increment,database,Node.js,Mongodb,Mongoose,Auto Increment,Database,给定一个模式: var EventSchema = new Schema({ id: { // ... }, name: { type: String }, }); 我想使id唯一并自动递增。我试图意识到,但在理解如何在猫鼬中正确地做这件事时遇到了问题 我的问题是:在mongoose中实现自动增量字段而不使用任何插件等的正确方法是什么?是的,这是该功能的“瘦”部分 您需要在mongo数据库中保存该集合。如果您愿意,它可以充当并发密

给定一个模式:

var EventSchema = new Schema({
    id: {
        // ...
    },
    name: {
        type: String
    },
});
我想使
id
唯一并自动递增。我试图意识到,但在理解如何在猫鼬中正确地做这件事时遇到了问题

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

是的,这是该功能的“瘦”部分

您需要在mongo数据库中保存该集合。如果您愿意,它可以充当并发密钥分配的单个真实记录。Mongo的示例向您展示了如何执行“原子”操作来获取下一个密钥,并确保即使存在并发请求,也能保证返回唯一密钥而不会发生冲突

但是,mongodb并不是本机实现该机制,而是向您展示了如何实现该机制。它们只提供_id作为唯一的文档密钥。我希望这能澄清你的做法


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

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

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);
      });
    });
你可以用这个。 此包每次都为此生成唯一值

包名:uniqid


Link:

我真的花了很多时间,试着自己去做。对于这样一个假问题,我很抱歉,我尝试了增量id预保存。但我必须如何处理计数器集合?我必须有它的模式吗?这是我无法解决的问题实际上这是一个糟糕的方法,应该忽略,他请求的操作类型需要是原子的。在并发请求的情况下,您可以轻松地获得相同的id两次。耶!这不是生产就绪应用程序的解决方案。如果服务器压力很大,您建议的操作可能会无人参与。。。这个操作是一个大分子而不是原子,用它代替Mongo的原生ObjectId有什么意义?该包还生成一个长标识符,OP可能需要一些简短且可读的内容,否则他们会使用ObjectId,ObjectId也总是递增的,只是不是1。可以通过解释代码如何工作来改进!
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();
    }
});