Mongoose 쿼리에서 반환 된 데이터를 수정할 수없는 이유 (예 : findById)


95

Mongoose Query에서 반환 된 데이터의 일부를 변경하려고하면 아무 효과가 없습니다.

어제 약 2 시간 동안 _.clone()임시 저장 변수를 사용하여 모든 종류의 s를 사용 하여이 문제를 파악하려고했습니다 . 마침내 내가 미쳐가는 순간에 해결책을 찾았습니다. 그래서 나는 미래에 누군가 (fyuuuture!)가 저장 문제를 가질 것이라고 생각했습니다.

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


답변:


161

이와 같은 경우 전체 모델 인스턴스 대신 일반 JS 객체를 원하는 경우 다음과 같이 lean()쿼리 체인을 호출 할 수 있습니다 .

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

이 방법 data은 이미 필요에 따라 조작 할 수있는 일반 JS 객체입니다.


8
Btw @JohnnyHK는 다시 한 번 감사의 말을 전하고 싶었습니다. 1 년 반 후 클라이언트가 무언가를 디버그하는 것을 돕고있었습니다. 그는 몽구스 개체를 수정하려고했기 때문에 그것이 회전에서, 그림 뭔가 밖으로하려고 주말을 보냈다; P
TOLI

1
2 년이 지난 지금도 그것을 부수고 있습니다. lean ()이 거기에 있다는 것을 깨닫지 못했습니다.
Petrogad

1
@Fizzix는 aggregate항상 결과를 일반 개체로 제공하므로 lean().
JohnnyHK

1
3 년 후 그것을 알아 내려고 한 시간을 보냈다. 내 하루 종일 구했습니다! 감사합니다
Noy

2
감사합니다! 이것은 정말 도움이되었지만 왜 객체를 수정할 수 없습니까? 어떤 종류의 특별한 물건입니까?
Robert Fedus

46

나는 Mongoose 문서가 이것을 충분히 명확하게하지 않는다고 생각하지만 쿼리에서 반환 된 데이터 (res.send () 할 수 있지만)는 실제로 JSON 객체가 아니라 Mongoose Document 객체입니다. 하지만 한 줄로 해결할 수 있습니다 ...

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
을 (를) 사용할 수도 있습니다. toObject(),는와 동일 toJSON()하지만 덜 혼란스러운 이름을 사용합니다.
JohnnyHK

1
이렇게하면 개발자가 가상으로 설정하는 것도 제거됩니까?
mjwrazor

5
TypeError: data.toObject is not a function나는 이것을 얻었습니다toJSON
Luzan Baral

을 수정하는 대신 result수정할 수있었습니다 result._doc.
nth-chile

@Luzan Baral Array 객체에 이러한 함수를 사용하고 있기 때문입니다. JSON.parse(JSON.stringify(data))객체 배열에 대신 사용
mohit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.