2013-10-04 2 views
7

Mongoose'un her zaman için lean queries olmasını istediğim bir salt okunur API'ım var.Mongoose: Varsayılan olarak doğruya (her zaman açık) doğru bir yol var mı?

Ben varsayılan olarak gerçek olamayacak kadar bir şema veya bağlantı düzeyinde ya bu etkinleştirebilir miyim? Böyle

+0

Şema düzeyinde uygulayabileceğiniz gibi görünmüyor (http://mongoosejs.com/docs/guide.html#options), bu yüzden bağlantı düzeyinde yapabileceğinizden şüpheliyim:/ – tomahaug

+1

Yalnızca mongodb native sürücüsünü doğrudan kullanmayı düşünün - her zaman * yalın *. – WiredPrairie

+0

@WiredPrairie - bu projede başka nedenlerden ötürü mongoose'a ihtiyaç var, ama teşekkürler. – k00k

cevap

13

kolay yolu alıyorum nerede, kolayca kavrayacak maymun yama eklemek mongoose.Query sınıftır yağsız seçeneği varsayılan:

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; 
}; 

Gelincik her sorgu için mongoose.Query yeni bir örneğini oluşturur ve setOptions çağrı mongoose.Query inşaatın bir parçası.

mongoose.Query sınıf yama ederek global üzerinde yalın sorguları açmak mümkün olacak. Böylece tüm mongoose yöntemleri (find, findOne, findById, findOneAndUpdate, vs.) yola gerek kalmayacaktır.

Mongoose populate gibi iç aramalar için Query sınıfı kullanır. Her alt sorguya orijinal Query seçenekleri geçer, bu nedenle sorunu olmamalıdır, ancak yine de bu çözüme dikkat edin.

+0

Çok daha iyi cevap :) Gelincik kaynak koduna derin övgü kazmak istiyorum sürece tabii ki, her model tanımı için bu kesmek gerçekleştirmek zorunda kalacak! – tomahaug

+0

bu, düğüm 6.7.0 ve firalama 4.5.8 ile çalışmaz. Bir fikrin neden? –

+2

Mongoose 4.5.8'de "this.options.lean" ifadesini "this.mongooseOptions.lean" olarak değiştirmem gerekiyordu. –

2

bir hack-etrafında yapılabilir bir şey:

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

Yeni: Model 'ın find yöntemi ile

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

Fiddle: sorgusu yürütme

Güncel yolu sorgu yürütülürken yolu:

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

Ben bu kodu test etmedim ama daha önce JavaScript kitaplığı işlevini geçersiz kılmak için çalıştık eğer

+0

size, benim daha – tomahaug