Mongoose Query tarafından döndürülen verileri neden değiştiremiyorsunuz (ör: findById)


95

Bir Mongoose Sorgusu tarafından döndürülen verilerin herhangi bir bölümünü değiştirmeye çalıştığımda hiçbir etkisi olmuyor.

Dün bunu yaklaşık 2 saat boyunca, her türlü _.clone()s ile, geçici depolama değişkenlerini kullanarak, vb . Anlamaya çalışıyordum . Son olarak, tam delirdiğimi düşündüğümde, bir çözüm buldum. Bu yüzden gelecekte birinin (fyuuuture!) Kurtarma sorunu yaşayabileceğini düşündüm.

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q; //has no effect

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});


Yanıtlar:


162

Tam model bir örnek yerine düz bir JS nesnesi istediğiniz bu gibi durumlarda, lean()sorgu zincirinde şu şekilde çağrı yapabilirsiniz :

Survey.findById(req.params.id).lean().exec(function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

Bu yol datazaten ihtiyaç duyduğunuzda işleyebileceğiniz düz bir JS nesnesidir.


8
Btw @JohnnyHK tekrar teşekkür etmek istedi. Bir buçuk yıl sonra bir müşterinin bir şeyde hata ayıklamasına yardımcı oluyordu. Kendisinin Gelincik Nesnesi değiştirmeye çalıştığım için öyleydi dönüşler dışarı, figür şey dışarı çalışırken bir hafta sonu geçirdi P
Toli

1
2 yıl sonra ve hala eziliyor. Lean () 'in orada olduğunu fark etmemiştim bile.
Petrogad

1
@Fizzix aggregate, sonuçlarını her zaman düz nesneler olarak sunar, bu nedenle buna gerek yoktur lean().
JohnnyHK 01

1
3 yıl sonra ve tüm saatini anlamaya çalışmakla harcadı. Bütün günümü kurtardım! Teşekkürler
Noy

2
Teşekkür ederim! Bu gerçekten yardımcı oldu, ancak nesneyi değiştirmek neden imkansız? Bu ne tür bir özel nesne?
Robert Fedus

46

Mongoose belgelerinin bunu yeterince netleştirmediğini düşünüyorum, ancak sorguda döndürülen veriler (bunu res.send () yapabilmenize rağmen) aslında bir Mongoose Document nesnesi ve bir JSON nesnesi DEĞİL. Ama bunu bir satırla düzeltebilirsiniz ...

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    var data = data.toJSON(); //turns it into JSON YAY!

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

12
Ayrıca kullanabilirsiniz toObject()olarak aynı işlevi gören, toJSON()ama daha az kafa karıştırıcı adıyla.
JohnnyHK

2
Bu aynı zamanda geliştiricinin koyduğu sanallardan da kurtulacak mı?
mjwrazor

5
TypeError: data.toObject is not a functionBunu da aynı şekilde anladımtoJSON
Luzan Baral

'Yi değiştirmek yerine, resultdeğiştirebildim result._doc.
nth-chile

@Luzan Baral Thats çünkü bu fonksiyonları Array nesnesi için kullanıyorsunuz. JSON.parse(JSON.stringify(data))Bunun yerine nesne dizileri için kullanın
mohit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.