2014-06-08 2 views
15

여기에 몇 가지 질문이 있지만 현재로서는 받아 들여진 접근 방법 인 해결책을 찾지 못하는 것 같습니다.MongoError : Mod on _id 허용 안함

MongoDB에서 문서를 업데이트하려고하는데 Mongoosejs를 사용하고 있습니다.

{ [MongoError: Mod on _id not allowed] 
    name: 'MongoError', 
    lastErrorObject: 
    { err: 'Mod on _id not allowed', 
    code: 10148, 
    n: 0, 
    connectionId: 35, 
    ok: 1 }, 
    ok: 0, 
    errmsg: 'Mod on _id not allowed' } 

I 업데이트를 만들기 위해 사용하고 코드는 다음과 같습니다 : I라는 "필드"를했기 때문에

app.put('/task/:short', auth, function (req, res) { 
    Task.findOneAndUpdate({short:req.params.short}, req.body, function(err, task) { 
    if(err) console.log(err); 
    res.json(200, {content: task}); 
    }) 
}); 

는 "short_id는"나는 거라고 생각하지만, 나는이 오류를 받고 있어요 필드 이름에 "_id"부분을 갖는 문제가 있으므로 "짧게"변경했지만 여전히 운이 없다 - 동일한 오류가 발생합니다. 나중에 _id 필드를 변경하려고한다고 생각하지만 그 이유는 알지 못합니다.

+0

req.body로 무엇을 전달합니까? –

+0

'req.body'에'_id'를 전달하고 있습니다. 나는 옳지 않아야합니까? – tommyd456

+1

글쎄, 아니, _id는 검색 부분에만 있어야하고 (업데이트 대상이 아님) –

답변

28

short (고유함)을 사용하여 문서를 찾고 업데이트하는 데 문제가있어서 _id이 업데이트 할 수없는 값으로 전송되었습니다.

따라서 매개 변수를 보내기 전에 객체에서 _id을 삭제했습니다.

delete the_object._id 

이제 모든 것이 작동합니다.

+0

감사합니다. 그것은 나를 도왔다. – ekqnp

7

다음과 같은 코드가 도움이 될 수 있습니다, lodash 사용하는 경우 ..

var id = update._id; 
var update = _.omit(update,'_id'); 
mongo.mCustomers.findOneAndUpdate({_id:id},update,callback); 
4

I 있었다 MongoDB를 3.x를 로컬 통과 테스트,하지만 난 CircleCI이 오류 (연속 통합 서비스)를 받고 한 이전 버전 (2.4.x)을 실행합니다.

새로운 버전의 설치가 시작되어 문제가 해결되었습니다.

0

이 문제는 MongoDB 버전 3.6에는 존재하지 않지만 버전 2.4를 사용하는 프로덕션 서버에서는 문제가되었습니다.

관련 문제