MongoDB自动增量不起作用

Posted

技术标签:

【中文标题】MongoDB自动增量不起作用【英文标题】:MongoDB auto incremental do not work 【发布时间】:2018-07-28 04:23:19 【问题描述】:

我尝试使用数字 _id 创建用户集合,但它创建为


    "_id": 
        "$oid": "5a880c0ca48be2060035cb97"
    ,
    "email": «example@gmail.com",
    "name": «IV",
    "password":       "$2a$10$bozaPRj2K7rcS8ZkmO9TkOUFKgCqKFD3C3nB7iB04JtYIkS8z1Kxe",
    "__v": 0

我使用mongoose和ExpressJs,这3个文件包含实现数字ID注册的代码。我找不到解决方案为什么它不起作用。

在 counter.js 中创建计数器:

var mongoose = require('mongoose');

var CounterSchema = new mongoose.Schema(
    _id:  type: String, required: true ,
    seq:  type: Number, default: 0 
);

var userCounter = mongoose.model('userCounter', CounterSchema);

module.exports = userCounter;

在 user.js 中创建用户

var mongoose = require('mongoose');
var bcrypt = require('bcrypt');
var userCounter = require('../models/counter');

var UserSchema = new mongoose.Schema(
    email: 
        type: String,
        unique: true,
        required: true,
        trim: true
    ,
    name: 
        type: String,
        required: true,
        trim: true
    ,
    password: 
        type: String,
        required: true,
    

);

//authenticate input against database documents
UserSchema.statics.authenticate = function(email, password, callback) 
    User.findOne( email: email )
        .exec(function(error, user) 
            if (error) 
                return callback(error);
             else if (!user) 
                var err = new Error('User not found.')
                err.status = 401;
                return callback(err);
            
            bcrypt.compare(password, user.password, function(error, result) 
                if (result === true) 
                    return callback(null, user);
                 else 
                    return callback();
                
            )
        );


//hash password before saving to database
UserSchema.pre('save', function(next) 
    var user = this;
    bcrypt.hash(user.password, 10, function(err, hash) 
        if (err) 
            next(err);
        
        user.password = hash;
        next();
    );
, function(next) 
    var user = this;
    userCounter.findByIdAndUpdate( _id: 'entityId' ,  $inc:  seq: 1  , function(error, counter) 
        if (error)
            return next(error);
        user._id = userCounter.seq;
        next();
    );
);



var User = mongoose.model('User', UserSchema);

module.exports = User; 

并使用帖子创建路线

var express = require('express');
var User = require('../models/user’);
// POST /register
router.post('/register', function(req, res, next) 
    if (req.body.email &&
        req.body.name &&
        req.body.password &&
        req.body.confirmPassword) 

        // confirm that user typed same password twice
        if (req.body.password !== req.body.confirmPassword) 
            var err = new Error('Passwords do not match.')
            err.status = 400;
            return next(err);
        

        // create object with form input 
        var userData = 
            email: req.body.email,
            name: req.body.name,
            password: req.body.password
        ;

        //use schema's 'create' method to insert document into Mongo
        User.create(userData, function(error, user) 
            if (error) 
                return next(error);
             else 
                return res.redirect('/login');
            
        );

     else 
        var err = new Error('All fields required.')
        err.status = 400;
        return next(err);
    
);

【问题讨论】:

【参考方案1】:

那是什么不完全有效? 正如我在您的代码中看到的,当使用 findByIdAndUpdate 时,您缺少 ' new: true ' 这意味着返回更新的模型而不是已经存在的模型:

....
userCounter.findByIdAndUpdate( _id: 'entityId' ,  new: true, $inc:  seq: 1  , function(error, counter) 
....

您可以查看这个答案:Mongoose findByIdAndUpdate not returning correct model

【讨论】:

我改为 userCounter.findByIdAndUpdate( _id: 'entityId' , new: true, $inc: seq: 1 , function(error, userCounter) 但它仍然使用"_id": "$oid": "5a8812f6287fe9066869893c" new: true 需要在 third 参数中作为单独的对象传递给findByIdAndUpdate 如果你的意思是添加_id: type: Number, default: 0 到UserSchema,它只会创建1个_id: 0的用户,不会创建更多 @JohnnyHK 是啊,也试过了,还是不明白为什么不行

以上是关于MongoDB自动增量不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 自动增量不起作用

SQLite PRIMARY 键自动增量不起作用

自动增量(身份)在 Fluent NHibernate 中不起作用

GORM 和 SQL Server:自动增量不起作用

Mysql 视图 - 自动增量不起作用(通过 Eloquent ORM)

为啥增量运算符不起作用? [复制]