Mongoose: schema.pre ('save') не запускается MyModel.update ()

Созданный на 16 июл. 2011  ·  11Комментарии  ·  Источник: Automattic/mongoose

example.js:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

mongoose.connect('mongodb://localhost/test')

var Thing = new Schema({
  title : String,
  content : String
})

Thing.pre('save', function(next){
  console.log("saving: %s (%s)", this.title, this.content)
  next()
})

var MyThing = mongoose.model('Thing', Thing)

var example = new MyThing({
  title : 'foo',
  content : 'bar'
})

example.save(function(err){
  MyThing.update({title:'foo'},{content:'baz'}, function(err, rs){
    console.log(rs)
  })  
})

Выход:

$ node example.js 
saving: foo (bar)
1

Pre запускается первоначальным сохранением, но не обновлением.

Самый полезный комментарий

Это не ошибка. pre save - это ловушка, которая срабатывает в экземплярах при вызове их метода сохранения, а не в модели при вызове обновления.

Model.update позволяет отправлять атомарные операции $ set прямо в mongodb.

Все 11 Комментарий

Это не ошибка. pre save - это ловушка, которая срабатывает в экземплярах при вызове их метода сохранения, а не в модели при вызове обновления.

Model.update позволяет отправлять атомарные операции $ set прямо в mongodb.

Это функция, которую я хотел бы иметь; особенно полезно при загрузке разреженных данных.

@aheckman Я согласен с @martindale , я чувствую, что в пользовательском интерфейсе, где у нас есть обновления формы $.ajax например, путем передачи req.body._id в почтовый маршрут, какой-то предварительный метод был бы удобен. Примером использования является случай, когда вы отправляете два числа и хотите, чтобы модель имела pre('save') для расчета итоговой суммы.

возможно pre('update') ofc

Я тоже это заметил, поэтому полагаю, что это не стоит добавлять.

Я решил использовать подход aheckmann, когда мне нужно обновить поле даты updatedOn моего объекта. Однако там, где аудит - это то, что я хотел бы использовать на уровне промежуточного программного обеспечения, от этого подхода плохо.

Установка даты в моем случае очень чувствительна к моменту, когда сохранение фиксируется в mongodb, поскольку у меня есть фоновый процесс, загружающий обновленные документы на основе движущегося окна даты и времени. Я не говорю, что будет большой сдвиг во времени, но подход Хекмана к pre('update') , вероятно, будет содержать больше отклонения к тому времени, когда произойдет сохранение.

Я бы хотел увидеть здесь некоторую опцию промежуточного программного обеспечения.

Итак, каков обходной путь? Я ожидал, что pre ('save') перехватит обновления, которые семантически кажутся мне сохранениями. Поскольку обновления настолько распространены, это делает ловушку сохранения гораздо менее ценной.

Я не уверен, смотрит ли кто-нибудь еще это или нет, но изучаю документацию Mongoose -
Мангуста
в разделе _Notes в findAndUpdate () _ содержится ссылка на issues / 964, объясняющее, почему это не работает. Надеюсь, это поможет! :)

Это хреновая чушь. мы не можем делать ничего асинхронно в сеттерах. идиоты.

это действительно старая ветка, но хорошо. Существуют предварительные версии, которые на самом деле создают это, или это было выяснено с момента публикации.

Все хорошо, Трент, я пошел дальше и реорганизовал свой код, чтобы сделать findById и последующее сохранение, так что хук предварительного сохранения для сохранения пароля по-прежнему работает. Я предполагаю, что это то, что есть, хотя было бы неплохо иметь ловушку для предварительного обновления, все равно потребуется два запроса для обслуживания операции, поскольку вы должны прочитать данные и проверить, изменились ли они каким-либо образом с помощью isModifed

Пометить # 964 и наткнуться на интерес.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги