Mongoose: schema.pre ('guardar') no activado por MyModel.update ()

Creado en 16 jul. 2011  ·  11Comentarios  ·  Fuente: Automattic/mongoose

ejemplo.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)
  })  
})

Producción:

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

El pre se activa con el guardado inicial, pero no con la actualización.

Comentario más útil

Esto no es un error. pre save es un gancho que se activa en instancias cuando se llama a su método de guardar, no en el modelo cuando se llama a update.

Model.update le permite enviar operaciones atomic $ set directamente a mongodb.

Todos 11 comentarios

Esto no es un error. pre save es un gancho que se activa en instancias cuando se llama a su método de guardar, no en el modelo cuando se llama a update.

Model.update le permite enviar operaciones atomic $ set directamente a mongodb.

Esta es una característica que me gustaría tener; especialmente útil cuando se respaldan datos escasos.

@aheckman Estoy de acuerdo con @martindale , creo que en las $.ajax , como pasar un req.body._id a una ruta de publicación, algún tipo de método previo sería útil. Un caso de uso de ejemplo es cuando envía dos números y desea que el modelo tenga pre('save') para calcular el total.

quizás pre('update') ofc

También he notado esto, así que supongo que no se considera una mejora que valga la pena agregar.

Decidí usar el enfoque de aheckmann donde necesito actualizar el campo de fecha updatedOn mi objeto. Sin embargo, cuando la auditoría es algo que me gustaría usar a nivel de middleware, este enfoque huele mal.

Establecer una fecha en mi caso es muy sensible al instante en que el guardado se confirma en mongodb, ya que tengo un proceso en segundo plano que carga documentos actualizados en función de una ventana de fecha y hora en movimiento. No estoy diciendo que haya mucha deriva en el tiempo, pero el enfoque de aheckmann frente a pre('update') probablemente contendría más deriva para cuando ocurra el guardado.

Me encantaría ver alguna opción de middleware aquí.

Entonces, ¿cuál es la solución? Esperaba que pre ('guardar') hubiera capturado actualizaciones, que semánticamente me parecen guardadas. Dado que las actualizaciones son tan comunes, el gancho de guardado es mucho menos valioso.

No estoy seguro de si alguien todavía está viendo esto o no, pero mirando las documentaciones de Mongoose:
Mangosta
en _Notas sobre findAndUpdate () _ la sección hace una referencia a los problemas / 964 que explica por qué esto no funciona. ¡Espero que ayude! :)

Esto es una puta mierda. no podemos hacer nada asincrónico en establecedores. idiotas.

Este es un hilo muy antiguo, pero está bien. Hay pres que realmente han entrado en esto o se ha descubierto desde la publicación.

Todo está bien, seguí adelante y reorganicé mi código para hacer un findById y luego un guardado posterior, por lo que el gancho previo al guardado para obtener una contraseña aún funciona. Supongo que es lo que es, aunque sería bueno tener un enlace previo a la actualización también, aún se necesitarán dos consultas para dar servicio a la operación, ya que debe leer los datos y verificar si ha cambiado de alguna manera con isModifed

Marcando el número 964 y generando interés.

¿Fue útil esta página
0 / 5 - 0 calificaciones