Подтвердить что ты не робот

Создание методов для обновления и сохранения документов с помощью мангуста?

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

Итак, как я могу это сделать?

У меня есть что-то подобное:

mySchema.statics.insertSomething = function insertSomething () {
    return this.insert(() ?
}
4b9b3361

Ответ 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. Я также не получаю ошибок при сохранении. Почему он не сохраняется в моей базе данных?