2015-08-05 16 views
7

Ön kancadaki sayıları güncelleştirmeye çalışıyorum. Sorun, bilinmeyen bir nedenle, findOneAndUpdate kancasının, anlayabildiğim kadarıyla belgeye erişememesidir.Mongoose pre findOneAndUpdate kanca sorunları

source.pre('findOneAndUpdate', function (next) { 
    console.log('------------->>>>>> findOneAndUpdate: '); 
    this.objects = this.objects || []; 
    this.people = this.people || []; 
    this.events = this.events || []; 

    this.objectCount = this.objects.length; 
    this.peopleCount = this.people.length; 
    this.eventCount = this.events.length; 

    next(); 
}); 

Ama nedense kanca içinde this yaklaşık işe yaramaz görünüyor belge, onun bir sorgu nesnesi değildir:

Bunu yapmak istiyorum.

Neyi eksik? FindOneAndUpdate'deki sayımları güncellemek için ön kancayı nasıl kullanırım?

cevap

5

documentation devletler:

Sorgu katman ince ama önemli bir şekilde belge katman farklıdır: belge ortakatmanlarına, this belge güncellenmektedir ifade eder. Sorgu ara katman yazılımında, mongoose'un güncelleştirilmekte olan belgeye bir başvurusu olması gerekmez, bu nedenle this, güncelleştirilmekte olan belgeden ziyade sorgu nesnesine başvurur. Tam belge mevcut değildir, bu yüzden:

bir güncelleme eylem genellikle yalnızca ( "Belge X ve Z değerine ayarlanır mülkiyet X bulmak" o MongoDB sunucusunu söyler) veritabanında mevcut bir belge günceller Mongoose'a ve dolayısıyla, sayıları güncelleyemezsiniz (bu, en azından uzunluklarını belirlemek istediğiniz dizilere erişim gerektirir).

Ayrıca, şemalarınızda neden ayrı ayrı *Count özelliklerine ihtiyacınız var? Belirli bir boyuta uyan dizileri sorgulamak isterseniz, doğrudan dizilerdeki $size işlecini kullanabilirsiniz.

Sayma özelliklerine gerçekten ihtiyacınız varsa, her bir güncelleştirme için, dizilerin her birine yaptığınız değişiklik sayısını (eklenen/silinen öğe sayısı bakımından) izlemeniz ve $inc operatörünü kullanmanız gerekir. sayımı ayarlamak için.

+0

Sayımlar, bu nedenle tüm listeyi tam olarak döndürdüğümde ayrıntıları bulmamaya çalıştığım gibi, 'bul' ile tüm öğelerin listesini döndürebilir ve dizileri hariç tutabilirim. Peki sayıları otomatik olarak nasıl güncellerim? Bana göre, belgeye erişimi olmayan bir ön kanca oldukça anlamsız. – Justin808

+0

@ Justin808 Dizi boyutlarını döndürmek istiyorsanız, [bir toplama] kullanmayı düşünün (http://docs.mongodb.org/manual/reference/operator/aggregation/size/). Sayıları güncellemek isterseniz, öncelikle veritabanından tüm belgeyi geri almanız, değerleri güncellemeniz, sayımları güncellemeniz (ya da bunun için _document_ middleware'i kullanmanız gerekir, 'pre (' save ')) 'gibi) ve kaydedin. veritabanına geri dönün. Açıklanan nedenlerle bir güncelleme yapamazsınız. – robertklep

+0

Sanırım '$ size' şeyini anlamıyorum. Şu anda bir SourceModel.find ({treeId: treeId}, '-objects -people -events', geri arama) yapıyorum. Nesnelerin, 'insanların 've' olayların 'dizilerinin boyutlarını döndürmek için oraya' $ size' öğesini nereye ekleyebilirim? – Justin808

5

Böyle smthng yapabilirsiniz ->

source.pre('findOneAndUpdate', function (next) { 
    console.log('------------->>>>>> findOneAndUpdate: '); 
    this._update.$set.objects = []; 
    this._update.$set.people = []; 
    this._update.$set.events = []; 
    next(); 
}); 

ödeme dikkat _update için bağlam "Bu" bir sorgu olacak çünkü set $.. Böylece istediğiniz her şeyi kolayca ekleyebilirsiniz!