복붙노트

[MONGODB] 몽구스가 : CastError가 : ObjectId가로 캐스트 경로에서 값 "[개체 개체]"실패 "_id"

MONGODB

몽구스가 : CastError가 : ObjectId가로 캐스트 경로에서 값 "[개체 개체]"실패 "_id"

나는 이것이 내가 간과 한 어리석은 뭔가 될 것이라는 느낌이 그래서 나는, Node.js를 새로운 오전,하지만 난 대답이 수정 내 문제를 찾을 수 없어. 난 할 노력하고있어 다음 요청자에게 자식 개체를 반환, 새 자식 객체를 생성하는 경로를 만들 아이들의 부모의 배열에 추가합니다. 내가으로 실행하고 있다는 문제는 findById 메소드로 문자열 ID를 전달하는 경우, 노드와 충돌한다는 것입니다

내가 대신 ObjectId가 전달하려고하면, 내가 얻을

여기에 내 코드의 대략적인 개요는 다음과 같습니다

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId

mongoose.connect('mongodb://user:password@server:port/database');

app.get('/myClass/:Id/childClass/create', function(request, result) {
  var id = new ObjectId(request.params.Id);
  MyClass.findById(id).exec( function(err, myClass) {
    if (err || !myClass) { result.send("error: " + err + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
    var child = ChildClass();
    myClass.Children.addToSet(child);
    myClass.save();
    result.send(child);
  });
});

내가 경로로이 코드를 실행하면 "/ myClass가 / 51c35e5ced18cb901d000001 / ChildClass에 생성 /"이 코드의 출력입니다 :

나는 {_ID : ID를} findOne를 사용하여 전달 시도했습니다 대신하지만,이 나타납니다은 findById 메소드가하는 정확하게 할 수 있습니다. 나는 다른 사이트에 나와 본 적이 ObjectId에 대한 서로 다른 클래스를 시도했습니다. 나는 함수 대신 생성자와 정의되지 않은 그 반환 같은 ObjectId가 ()를 호출 시도했습니다. 이 시점에서, 나는 아이디어를 밖으로 실행하는거야 그리고 답변을 인터넷 검색을하는 것이 도움이되는 것 같지 않습니다. 내가 잘못을 뭘하는지에 대한 어떤 아이디어?

내가 말했듯 또한, 내가 노드에 새로 온 / 몽고 / 몽구스 / Express는, 나의 목표를 달성하기 위해 더 나은 방법이 있는지 알려 주시기 바랍니다. 나는 모든 의견을 보내 주셔서 감사합니다.

편집하다:

피터 리용에서 해결 한 후, 나는에 실행중인 또 다른 오류를 봤 예상대로 작동하고 내가해야 할 바라고 정확히 수행 findByIdAndUpdate을 발견했다. findById 메소드와 findOne 나에게 이러한 문제를주고 있었다 나는 (아마도 버그 리포트를 제출해야합니다) 알고 궁금 왜 다른 답을 가지고 사건 사람이 오픈 떠날거야, 그래서 나는 확실히 아직 모르겠어요.

해결법

  1. ==============================

    1.짧은 답변 : mongoose.Types.ObjectId를 사용합니다.

    짧은 답변 : mongoose.Types.ObjectId를 사용합니다.

    몽구스 (그러나 몽고) 그래서 그냥 사용하면 제대로 개체를 문자열로 ID와 "캐스팅"그들을 받아 들일 수 :

    MyClass.findById(req.params.id)
    

    req.params.id 당신이 잡을 수 있어야 예외가 발생하는 몽고의 ID 문자열에 대한 올바른 형식이 아닌 경우 단,주의해야 할 점은있다.

    이해하는 주요 혼란 것은 mongoose.SchemaTypes는 몽구스의 스키마를 정의 할 때에만 사용하는 물건을 가지고 있으며, mongoose.Types 데이터를 생성하는 데이터베이스 또는 쿼리 객체에 저장할 객체 때 사용하는 물건을 가지고 있다는 것입니다 그래서. mongoose.Types.ObjectId 그래서 ( "51bb793aca2ab77a3200000d")의 작품은, 당신이 쿼리의 데이터베이스 또는 사용에 저장할 수있는 객체를 제공하고 잘못된 ID 문자열을 주어진 경우 예외가 발생합니다.

    findOne 쿼리 객체를 사용하여 콜백에 단일 모델 인스턴스를 전달합니다. 그리고 findById 메소드는 문자 그대로 findOne의 래퍼입니다 ({_ ID : ID}) (여기에 소스 코드 참조). 그냥 발견은 쿼리 객체를 사용하여 콜백에 일치하는 모델 인스턴스의 배열을 전달합니다.

    그냥 천천히 이동합니다. 그것은 혼란하지만이 시점에서 몽구스의 타격 버그를 혼동하지지고 당신을 보장 할 수 있습니다. 그것은 꽤 성숙 라이브러리, 그러나 그것은 그것의 묘리를 터득하기 위해 약간의 시간이 소요됩니다.

    ChildClass에를 인스턴스화 할 때 난 당신의 코드에서 볼 수있는 다른 의심스러운 것은 새로운 사용되지 않습니다. 우리가 당신이 남아있는 CastErrors을 기관 수 있도록하기위한 그건 그렇고, 당신은 순서대로 스키마 코드를 게시해야합니다.

  2. ==============================

    2.나는 당신의 오류를 해결해야한다 "만일"당신이 _id 필드에서 필터링 할 값이 ID를 형식 아니다 때문이었다,이 오류에 직면했습니다.

    나는 당신의 오류를 해결해야한다 "만일"당신이 _id 필드에서 필터링 할 값이 ID를 형식 아니다 때문이었다,이 오류에 직면했습니다.

    const mongoose = require('mongoose');
    
    console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
    // true
    console.log(mongoose.Types.ObjectId.isValid('whatever'));
    // false
    

    검색을위한 기준 값이 유효한 ObjectId가 인 경우를 해결하기 위해, 항상 확인

    const criteria = {};
    criteria.$or = [];
    
    if(params.q) {
      if(mongoose.Types.ObjectId.isValid(params.id)) {
        criteria.$or.push({ _id: params.q })
      }
      criteria.$or.push({ name: { $regex: params.q, $options: 'i' }})
      criteria.$or.push({ email: { $regex: params.q, $options: 'i' }})
      criteria.$or.push({ password: { $regex: params.q, $options: 'i' }})
    }
    
    return UserModule.find(criteria).exec(() => {
      // do stuff
    })
    
  3. ==============================

    3.모든 사람들이이 문제에 붙어 있지만, 여전히 해결되지 수 : 나도 같은 오류가 우연히 빈되는 _id 필드를 발견했다.

    모든 사람들이이 문제에 붙어 있지만, 여전히 해결되지 수 : 나도 같은 오류가 우연히 빈되는 _id 필드를 발견했다.

    좀 더 구체적으로 여기 설명했다. 아직 나에게 더러운 해킹하지-ID 필드에 _id의 필드를 변경을 제외하고 해결책을 발견하지 않았습니다. 아마 몽구스에 대한 버그보고를하겠습니다. 어떤 도움을 주시면 감사하겠습니다!

    편집 : 내 스레드를 업데이트했습니다. 나는 티켓을 제출하고 누락 된 _id 문제를 확인했다. 지금 당장 사용할 수있는 릴리스 후보가있는 4.x.x 버전에서 수정 될 것입니다. rc가 생산적인 사용하지 않는 것이 좋습니다!

  4. ==============================

    4.이 문제가 발생하고 있고이 라인을 따라 채우기 어딘가를 수행하는 경우,이 몽구스 문제를 참조하십시오.

    이 문제가 발생하고 있고이 라인을 따라 채우기 어딘가를 수행하는 경우,이 몽구스 문제를 참조하십시오.

    몽구스 4.0로 업데이트하고 문제가 수정되었습니다.

  5. ==============================

    5.같은 문제를했다, 난 그냥 문자열로 ID를 강요.

    같은 문제를했다, 난 그냥 문자열로 ID를 강요.

    내 스키마

    const product = new mongooseClient.Schema({
        retailerID: { type: mongoose.SchemaTypes.ObjectId, required: true, index: true }
    });
    

    그리고, 때 삽입 :

    retailerID: `${retailer._id}`
    
  6. ==============================

    6.나는이 오류 CastError를 수신했다 : ObjectId가로 캐스트 값 실패 "[object Object]"를 경로에 "_id"다음을 수정하고 그것을 아래로 추적 할 수 스키마를 만든 후. 나는 컬렉션의 모든 문서를 삭제하고 나는 1 개체가 아니라 두 번째를 추가 할 수 있습니다. 나는 몽고의 컬렉션을 삭제 끝내었고, 몽구스 컬렉션을 다시로 그했다.

    나는이 오류 CastError를 수신했다 : ObjectId가로 캐스트 값 실패 "[object Object]"를 경로에 "_id"다음을 수정하고 그것을 아래로 추적 할 수 스키마를 만든 후. 나는 컬렉션의 모든 문서를 삭제하고 나는 1 개체가 아니라 두 번째를 추가 할 수 있습니다. 나는 몽고의 컬렉션을 삭제 끝내었고, 몽구스 컬렉션을 다시로 그했다.

  7. ==============================

    7.기록을 위해 : 내가 잘못된 방법으로 하위 문서를 채우려이 오류가 있었다 :

    기록을 위해 : 내가 잘못된 방법으로 하위 문서를 채우려이 오류가 있었다 :

    {
    [CastError: Cast to ObjectId failed for value "[object Object]" at path "_id"]
    message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
    name: 'CastError',
    type: 'ObjectId',
    path: '_id'
    value:
      [ { timestamp: '2014-07-03T00:23:45-04:00',
      date_start: '2014-07-03T00:23:45-04:00',
      date_end: '2014-07-03T00:23:45-04:00',
      operation: 'Deactivation' } ],
    }
    

    잘못된 :보기 ^ 값은 객체를 포함하는 배열입니다!

    설명 :이 방법으로 Node.js를 API로 PHP에서 데이터를 전송했다 :

    $history = json_encode(
    array(
      array(
      'timestamp'  => date('c', time()),
      'date_start' => date('c', time()),
      'date_end'   => date('c', time()),
      'operation'  => 'Deactivation'
    )));
    

    당신이 $ 역사를 볼 수있는 것은 배열을 포함하는 배열입니다. 몽구스가 배열 대신보다 Scheme.ObjectId (또는 다른 데이터 유형)과 (또는 다른 필드) _id 채우기 위해 노력하는 이유입니다. 다음 작품 :

    $history = json_encode(
    array(
      'timestamp'  => date('c', time()),
      'date_start' => date('c', time()),
      'date_end'   => date('c', time()),
      'operation'  => 'Deactivation'
    ));
    
  8. ==============================

    8.내 Node.js를 밖으로 같은 problem.Turns가 구식이되었다 가졌다. 업그레이드 후에는 일하고있어.

    내 Node.js를 밖으로 같은 problem.Turns가 구식이되었다 가졌다. 업그레이드 후에는 일하고있어.

  9. ==============================

    9.나는이 몽구스 오류 CastError가 발생했습니다 ObjectId가로 캐스트 값 \ 실패 "583fe2c488cf652d4c6b45d1 \"경로에  모델 사용자에 대한 \ "_ ID \"

    나는이 몽구스 오류 CastError가 발생했습니다 ObjectId가로 캐스트 값 \ 실패 "583fe2c488cf652d4c6b45d1 \"경로에  모델 사용자에 대한 \ "_ ID \"

    내가 NPM list 명령을 실행 그래서 내 로컬에서 MongoDB를하고 몽구스 버전을 확인합니다. 보고서를 Heres는 : ...... ...... ├── mongodb@2.2.19 ├── mongoose@4.7.2 .....

    내가 제거하고 2.2.16로 다른 버전 등을 사용하려고입니다했다 그래서이 MongoDB의 버전에 문제가있는 것 같다

    NPM 제거 MongoDB를 $, 그것은 당신의 node_modules 디렉토리에서 MongoDB를 삭제됩니다. 그 후 MongoDB를의 낮은 버전을 설치합니다. mongodb@2.2.16를 설치 NPM $ 마지막으로, 나는 응용 프로그램을 다시 시작하고 CastError은 사라입니다!

  10. ==============================

    10.그냥 예를 들어 작동 경로를 변경

    그냥 예를 들어 작동 경로를 변경

    app.get('/myClass/:Id/childClass/create', function(request, result) .....
    

    로 변경

    app.get('/myClass**es**/:Id/childClass/create', function(request, result) .....
    

    난 그냥이 될 경로 (myClass가)에 --es-- 추가 (MyClasses를)

    지금 작업을해야하고 오류가 표시되지 않습니다

  11. ==============================

    11.내 솔루션 그래서, 내가 모든 문서에서 데이터를 원하고 내가 _id 싶지 않는 것입니다

    내 솔루션 그래서, 내가 모든 문서에서 데이터를 원하고 내가 _id 싶지 않는 것입니다

    User.find({}, {_id:0, keyToShow:1, keyToNotShow:0})
    
  12. from https://stackoverflow.com/questions/17223517/mongoose-casterror-cast-to-objectid-failed-for-value-object-object-at-path by cc-by-sa and MIT license