Mongoose: schema.pre ('save') não acionado por MyModel.update ()

Criado em 16 jul. 2011  ·  11Comentários  ·  Fonte: 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)
  })  
})

Saída:

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

O pré é acionado pelo salvamento inicial, mas não pela atualização.

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.

Todos 11 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações