【问题标题】:MongoDB auto incremental do not workMongoDB自动增量不起作用
【发布时间】:2023-03-21 03:40:01
【问题描述】:

我尝试使用数字 _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);
    }
});

【问题讨论】:

    标签: mongodb express


    【解决方案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 是啊,也试过了,还是不明白为什么不行
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2013-05-25
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2015-08-06
    • 2021-11-26
    相关资源
    最近更新 更多