2013-10-04 5 views
7

Ho un'API di sola lettura che mi piacerebbe che Mangusta abbia sempre lean queries per.Mongoose: esiste un modo per impostare l'inclinazione su true (sempre attiva)?

Posso abilitare questo su uno schema o livello di connessione per essere vero per impostazione predefinita?

+0

Non sembra che sia possibile applicarlo a livello di schema (http://mongoosejs.com/docs/guide.html#options), quindi dubito che sia possibile farlo a livello di connessione:/ – tomahaug

+1

considera solo l'uso diretto del driver mongodb nativo - è sempre * magro *. – WiredPrairie

+0

@WiredPrairie - ho bisogno di mangusta su questo progetto per altri motivi, ma grazie. – k00k

risposta

13

Il modo più semplice è quello di patch di scimmia mongoose.Query classe da aggiungere opzione predefinita magra:

var __setOptions = mongoose.Query.prototype.setOptions; 

mongoose.Query.prototype.setOptions = function(options, overwrite) { 
    __setOptions.apply(this, arguments); 
    if (this.options.lean == null) this.options.lean = true; 
    return this; 
}; 

Mongoose crea nuova istanza di mongoose.Query per ogni query e setOptions chiamata è una parte di mongoose.Query costruzione.

Con il patching della classe mongoose.Query sarete in grado di trasformare le query lean su tutto il mondo. Quindi non è necessario seguire tutti i metodi mongoose (find, findOne, findById, findOneAndUpdate, ecc.).

Mongoose utilizza la classe Query per chiamate interne come popolare. Supera le opzioni originali Query per ogni sottoquery, quindi dovrebbe essere senza problemi, ma attenzione comunque con questa soluzione.

+0

Risposta molto migliore della mia, complimenti a te! – tomahaug

+0

questo non funziona con il nodo 6.7.0 e mangusta 4.5.8. Qualche idea del perché? –

+2

In mangusta 4.5.8 ho dovuto cambiare "this.options.lean" in "this.mongooseOptions.lean". –

2

Un qualcosa di mod-around è stato possibile eseguire in questo modo:

attuale modo di esecuzione della query:

Model.find().lean().exec(function (err, docs) { 
    docs[0] instanceof mongoose.Document // false 
}); 

Fiddle con find metodo s' il Model:

var findOriginal = Model.prototype.find; 
Model.prototype.find = function() { 
    return findOriginal.apply(this, arguments).lean(); 
} 

Nuovo modo di eseguire la query:

Model.find().exec(function (err, docs) { 
    docs[0] instanceof mongoose.Document // false 
}); 

ho non testato questo codice, ma se si è tentato di ridefinire le funzionalità della libreria in JavaScript prima, vi sarà facile capire dove sto ricevendo

+0

Dovrai ovviamente eseguire questo hack per ogni definizione del modello, a meno che tu non voglia approfondire il codice sorgente di Mongoose :) – tomahaug

Problemi correlati