Копировать _id в новое поле при создании новых документов (сохранить)

У меня есть эта схема в мангусте

ProfileEmailSchema = module.exports = mongoose.Schema({
    username: {
        type: String,
        unique: true,
        index: true,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    profile: { type: Number, unique: true, required: true, index: true },
    email: {
        type: String,
        required: true,
        unique: true,
        index: true
    },
    fullname: {
        type: String,
        required: true

    },
    display_picture: {
        type: String
    },
    isProfileCompleted: {
        type: Boolean,
        deafult: false
    },
    profile: created_at: { type: Date, default: Date.now },
    updated_at: { type: Date, default: Date.now }
});


ProfileEmailSchema.pre('save', function(next) {
    log("Saving  Profile Data :");
    now = new Date();
    this.updated_at = now;
    if (!this.created_at) {
        this.created_at = now
    }
    next();
});


ProfileEmailSchema.pre("save", function(next) {
    var user = this;

    // only hash the password if it has been modified (or is new)
    if (!user.isModified('password')) return next();

    // generate a salt
    bcrypt.genSalt(10, function(err, salt) {
        if (err) return next(err);

        // hash the password using our new salt
        bcrypt.hash(user.password, salt, function(err, hash) {
            if (err) return next(err);

            // override the cleartext password with the hashed one
            user.password = hash;
            next();
        });
    });

});


// test Function
ProfileEmailSchema.methods.find = function(cb) {
    this.model('ProfileEmailModel').findOne({}, cb);
};

//Pass Comparison Function
ProfileEmailSchema.methods.comparePassword = function(password, cb) {
    log("Compare Password with HASHED pass");
    log(password);
    log("HASHED");
    log(this.password);
    bcrypt.compare(password, this.password, function(err, isMatch) {
        if (err) return cb(err);

        log("Return Status:");
        log(isMatch);
        cb(null, isMatch);
    });
};

ProfileEmailModel = module.exports = mongoose.model("ProfileEmailModel", ProfileEmailSchema);

Проблема, с которой я сталкиваюсь, заключается в том, что мне необходимо скопировать _id в поле профиля при выполнении описанной ниже операции.

 var tuple = new UserProfileModel({
                    username: profile.username,
                    email: profile.email,
                    fullname: profile.fullname,
                    password: profile.password,
                });

 console.log(tuple);

Я пытаюсь использовать как это, но безрезультатно

 var tuple = new UserProfileModel({
                username: profile.username,
                email: profile.email,
                fullname: profile.fullname,
                password: profile.password,
                profile :  mongoose.Schema.Types.ObjectId
            });

 console.log(tuple);

Но это не работает. При создании первого документа с использованием tuple.save() я должен убедиться, что _id скопирован в ключ profile при создании новых документов.

Пожалуйста, предложите. В противном случае мне потребуется внести изменения в приложение, которое будет снова через 4 месяца.

Всего 1 ответ


Я нашел лучшее решение. использовал pre крючок

  UserProfileSchema.pre('save', function(next) {

    console.log("#####################");
    console.log("Saving  New Document :");
    now = new Date();
    this.updated_at = now;
    if (!this.created_at) {
        this.created_at = now
    }
    console.log("Login Type :");
    console.log(this.login_type);
    if (this.login_type == 'email') {
        console.log("Saving _id To Profile");
        console.log("ID :" + this._id);
        var ID = this._id;
        this.profile = ID;
        console.log(" Profile :");
        console.log(this.profile);
    }

    next();
});

Это простой способ скопировать _id при сохранении данных. Я использовал крючок PRE предоставленный мангустом. я получаю _id и назначаю profile .

Это решило мою проблему


Есть идеи?

10000