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.
Это функция, которую я хотел бы иметь; особенно полезно при загрузке разреженных данных.
@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 и наткнуться на интерес.
Самый полезный комментарий
Это не ошибка. pre save - это ловушка, которая срабатывает в экземплярах при вызове их метода сохранения, а не в модели при вызове обновления.
Model.update позволяет отправлять атомарные операции $ set прямо в mongodb.