Создание методов для обновления и сохранения документов с помощью мангуста?
После проверки официальной документации я до сих пор не знаю, как создавать методы для использования в mongoose
для создания и обновления документов.
Итак, как я могу это сделать?
У меня есть что-то подобное:
mySchema.statics.insertSomething = function insertSomething () {
return this.insert(() ?
}
Ответы
Ответ 1
Методы используются для взаимодействия с текущим экземпляром модели. Пример:
var AnimalSchema = new Schema({
name: String
, type: String
});
// we want to use this on an instance of Animal
AnimalSchema.methods.findSimilarType = function findSimilarType (cb) {
return this.find({ type: this.type }, cb);
};
var Animal = mongoose.model('Animal', AnimalSchema);
var dog = new Animal({ name: 'Rover', type: 'dog' });
// dog is an instance of Animal
dog.findSimilarType(function (err, dogs) {
if (err) return ...
dogs.forEach(..);
})
Статики используются, когда вы не хотите взаимодействовать с экземпляром, но делаете связанные с моделью вещи (например, для поиска всех животных с именем "Rover" ).
Если вы хотите вставить/обновить экземпляр модели (в db), то methods
- это путь. Если вам просто нужно сохранить/обновить материал, вы можете использовать функцию save
(уже существующую в Mongoose). Пример:
var Animal = mongoose.model('Animal', AnimalSchema);
var dog = new Animal({ name: 'Rover', type: 'dog' });
dog.save(function(err) {
// we've saved the dog into the db here
if (err) throw err;
dog.name = "Spike";
dog.save(function(err) {
// we've updated the dog into the db here
if (err) throw err;
});
});
Ответ 2
Изнутри статического метода вы также можете создать новый документ, выполнив следующие действия:
schema.statics.createUser = function(callback) {
var user = new this();
user.phone_number = "jgkdlajgkldas";
user.save(callback);
};
Ответ 3
Не думайте, что вам нужно создать функцию, которая вызывает .save(). Все, что вам нужно сделать до сохранения модели, можно выполнить с помощью . Pre()
Если вы хотите проверить, создается или обновляется модель, выполните проверку для this.isNew()
Ответ 4
Я пытаюсь это, но это не работает.
const userSchema = new mongoose.Schema(
{
recovery: {
type: {
token: String,
date: Date
},
default: {}
}
}
);
userSchema.methods.createPasswordRecoveryToken = () => {
this.recovery = {};
this.recovery.token = crypto.randomBytes(16).toString("hex");
this.recovery.date = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
return this.recovery;
};
//Controller POST(email)
createRecovery(req, res, next) {
User.findOne({ email })
.then(user => {
if (!user)
return res.render("recovery", {
error: "No user with this email.",
success: null
});
const recoveryData = user.createPasswordRecoveryToken();
return user.save(err => {
if (err) {
console.log(err);
return;
}
console.log(recoveryData);
console.log(user.recovery.token);
});
})
.catch(next);
}
createPasswordRecoveryToken работает отлично. Когда я регистрирую recoveryData, я получаю токен и дату. Но затем, когда я регистрирую user.recovery.token, я получаю Undefined. Я также не получаю ошибок при сохранении. Почему он не сохраняется в моей базе данных?