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)
})
})
Saída:
$ node example.js
saving: foo (bar)
1
O pré é acionado pelo salvamento inicial, mas não pela atualização.
Este não é um bug. pre save é um gancho que dispara em instâncias quando seu método save é chamado, não no modelo quando update é chamado.
Model.update permite enviar operações atomic $ set diretamente para mongodb.
Esse é um recurso que eu gostaria de ter; especialmente útil ao fazer o upsert de dados esparsos.
@aheckman Concordo com @martindale , acho que em UI's onde temos $.ajax
atualizações de formulários, como passar req.body._id
para uma rota de postagem, algum tipo de método de pré seria útil. Um exemplo de caso de uso é quando você envia dois números e gostaria que o modelo tivesse pre('save')
para calcular o total.
talvez pre('update')
ofc
Eu também percebi isso, então presumo que não seja considerado um aprimoramento que valha a pena adicionar.
Decidi usar a abordagem de aheckmann em que preciso atualizar o campo de data updatedOn
meu objeto. No entanto, onde a auditoria é algo que eu gostaria de usar no nível de middleware, essa abordagem cheira mal.
Definir uma data no meu caso é muito sensível ao instante em que o salvamento é confirmado para mongodb, já que tenho um processo em segundo plano carregando documentos atualizados com base em uma janela móvel de data e hora. Não estou dizendo que haveria muito desvio de tempo, mas a abordagem de aheckmann vs. pre('update')
provavelmente conteria mais desvio no momento em que o salvamento acontecesse.
Eu adoraria ver alguma opção de middleware aqui.
Então, qual é a solução alternativa? Eu esperava que o pre ('salvar') capturasse as atualizações, que semanticamente parecem salvos para mim. Como as atualizações são tão comuns, o gancho para salvar torna-se muito menos valioso.
Não tenho certeza se alguém ainda está assistindo isso ou não, mas olhando para as documentações do Mongoose -
Mangusto
na seção _Notes on findAndUpdate () _ faz uma referência a issues / 964 que explica por que isso não funciona. Espero que ajude! :)
Isso é besteira. não podemos fazer nada assíncrono nos setters. idiotas.
este é um tópico muito antigo, mas ok. Existem pré-requisitos que realmente inturup isso ou foi descoberto desde o post.
Está tudo bem, trent, eu fui em frente e reorganizei meu código para fazer um findById e então um salvamento subsequente, então o gancho pré-salvamento para salgar uma senha ainda funciona. Eu acho que é o que é, embora fosse bom ter um gancho de pré-atualização também, ainda serão necessárias duas consultas para atender à operação, já que você deve ler os dados e verificar se eles mudaram de alguma forma com isModifed
Marcando # 964 e batendo em interesse.
Comentários muito úteis
Este não é um bug. pre save é um gancho que dispara em instâncias quando seu método save é chamado, não no modelo quando update é chamado.
Model.update permite enviar operações atomic $ set diretamente para mongodb.