как я могу создать поле автоинкремента в мангусте

может ли кто-нибудь сказать мне, как я могу создать поле автоинкремента в мангусте без использования какой-либо библиотеки или плагина. Любой простой и легкий способ..


person lakshmankashyap    schedule 17.01.2017    source источник
comment
пожалуйста, посмотрите stackoverflow.com/a/30164636/1530987   -  person Chandan Rai    schedule 17.01.2017


Ответы (2)


существует очень простой и легкий способ реализовать автоматическое увеличение в мангусте с помощью функции предварительного сохранения мангуста. Вот мои коды для сбора пользователей, попробуйте тот же трюк в своей модели (схеме) мангуста, чтобы реализовать автоматическое увеличение. Вставьте этот код в файл схемы коллекции и замените некоторые переменные(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();
    });
});
person Utkarsh Pandey    schedule 17.01.2017
comment
Это недопустимое решение. Если запись будет удалена из середины, для нескольких записей будет один и тот же идентификатор, поскольку вы берете длину документа и увеличиваете ее на 1. stackoverflow.com/questions/28357965/mongoose-auto-increment - person Shihab; 17.01.2018
comment
В моем случае я использовал функцию мягкого удаления, поэтому этого не произошло. - person Utkarsh Pandey; 21.07.2020
comment
Я добавляю еще один ответ, чтобы дать вам больше решений. - person Utkarsh Pandey; 21.07.2020

Если вы используете функцию обратимого удаления, приведенный выше ответ может сработать, но решить эту проблему можно несколькими способами. 1: Перед вставкой новой записи выберите последний документ (строку) и поставьте id = 1 + (id of the last record). 2: Вы можете использовать плагин mongoose-auto-increment. 3: Последний, но не менее важный вариант: сохранить последнее увеличенное значение в отдельной коллекции (имя коллекции: autoIncrement столбца будут коллекцией, а sno), перед созданием записи выбрать значение sno этой коллекции, увеличить его, создайте свою запись и снова обновите значение sno в коллекции autoIncrement.

Бонус:

1: Вы можете создать автоинкремент в Redis.

2: первый пункт этого ответа не сможет решить несколько проблем, например: ваше приложение будет вести себя при удалении, если пользователь удалит строку из начала или середины вашей коллекции, он удалит этот идентификатор (это sno. form table), но на случай, если пользователь удалит последнюю запись. Это поставит то сно. в следующей записи.

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();
    });
});
person Utkarsh Pandey    schedule 21.07.2020