2015-05-23 6 views
5

Sto cercando di utilizzare la nuova versione instabile di mangusta> 4.0.0 per convalidare le query di aggiornamento.Nel middleware pre di mangusta, come posso accedere alla query di aggiornamento?

dire che io voglio aggiornare uno schema utilizzando la seguente query

schema.update({_id:'blah'},{a:'blah'},function(err){ 
//do your thing 
}) 

così Diciamo che ho il seguente schema,

var schema = new Schema({ 
a:{type:String} 
}); 

schema.pre('update',function(next){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

// how do i get {a:'blah'}???? 

next(); 
}); 

Come faccio ad avere la query di aggiornamento di {set: {a: 'blah'}} nel pre middleware in modo da poter eseguire alcuni controlli prima di eseguire l'aggiornamento?

alternativa So che la query di aggiornamento è possibile accedere nel post middleware, in

schema.post('update',function(){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

var updateQuery=this._update; //gives {$set:{a:'blah'}} 

next(); 
}); 

ma questo è troppo tardi, ho bisogno di questo nel middleware pre controllare prima di poter realmente aggiornare il db.

ho provato a cercare attraverso l'oggetto "this" del middleware pre, ma non sono riuscito a trovare l'oggetto updateQuery da nessuna parte e this._update non è definito nel middleware pre.

C'è un modo per farlo? grazie

risposta

1

Nel caso si stia ancora cercando una soluzione che funzioni sulle operazioni con gli array, sembra che nelle nuove versioni di mangusta (almeno 4.0.7+), this._update è definito nel pre-middleware.

0

Ho trovato un lavoro in giro attraverso questo particolare esempio, tuttavia non risolve abbastanza il mio problema reale. quello che puoi fare nella versione di mongoose ~ 4.0.0 è lasciare che il pre middleware specifichi di passare attraverso la validazione del modello in fase di aggiornamento.

schema.pre('update',function(next){ 
    this.options.runValidators = true; // make sure any changes adhere to schema 
}) 

fondamentalmente, è possibile specificare i validatori all'interno dello schema

var schema = new Schema({ 
    a:{ 
     type:String, 
     validate:[...] //the validation you want to run 
    } 
}); 

è possibile scegliere di saltare la validazione su un normale operazione di salvataggio utilizzando il controllo this.isNew all'interno funzioni di validazione.

questo codice eseguirà la convalida: [...] su qualsiasi $ set e $ unset su a nella query di aggiornamento.

tuttavia, non funziona su operazioni di array come $ push o $ addToSet per qualche motivo. quindi se aggiorni un array, non eseguirà affatto il codice di convalida! quindi non risolve il problema reale di fronte. ma può funzionare con l'esempio fornito per chiunque incontri questo particolare problema

Problemi correlati