2011-08-03 3 views
1

내 컬렉션에 문서를 저장하려고하는데 저장이 성공하면이 동일한 문서의 _id를 반환하십시오. 문제는 몽구스에서 생성 된 모델이나 콜백 리턴에서 두 경우 모두 내 _id에 정의되지 않은 값을 얻는 것입니다. 기본적으로 _id를 얻는 유일한 방법은 속성 중 하나를 사용하여 문서를 검색 한 다음 값을 가져 오는 것입니다. 이 접근법은 내가 원하는 바가 아니며, 현재 무엇을해야하는지 알면 효과가있다.Node.js & Mongoose, 복구 할 수 없습니다. _id

var createTrophy = new Trophy({ 
    name   : post.name, 
    accessCode  : post.password, 
    description  : post.description, 
    members   : [id] 
    }); 

    Trophy.findOne({name:post.name}, function(err, trophy) { 
    if(err){ 
     console.log('Mongoose: Error: ' + err); 
     res.send('Error db query -> ' + err); 
    } 
    else if(trophy){ 
     console.log('Trophy ' + trophy.name + ' already existant'); 
     res.send('Trophy ' + trophy.name + ' already existant'); 
    }else{ 
    createTrophy.save(function(err, doc){ 
     var uid = createTrophy._id; 
     if (err) { 
     console.log('Error in trophy saving:' + err); 
     res.send('Error in trophy saving:' + err); 
     }else{ 
     User.findOne({_id:post.id}, function(err, user) { 
      if(err){ 
      console.log('Mongoose: Error: ' + err); 
      res.send('Error db query -> ' + err); 
      } 
      else if(user){ 
      console.log(doc._id + ' ' + uid); 
      user.trophyLink = doc._id; 
      res.send(user); 
      //user.save(function(err){ 
      // if(err){res.send('Couldnt update trophy of profile');} 
      //}); 
      } 
      else{ 
      console.log('User id Inexistant'); 
      res.send('User id Inexistant'); 
      } 
     }); 
     } 
    }); 
    } 
    }); 
}); 

당신이 당신의 스키마에 _id를 제공 할 필요가 없습니다

var Trophy = new Schema({ 
     _id    : ObjectId, 
     name   : String, 
     accessCode  : String, 
     description  : String, 
     //reference to User ID 
     members   : [Number], 
     comments  :[Comment] 
    }); 

답변

2

스키마가 자동으로 생성됩니다. 이름을 고유하게하려면 스키마에서이 이름을 구성 할 수도 있습니다. members이 "실제"사용자 _ids라고 가정 할 경우 과 같이 sth를 시도하십시오.

var TrophySchema = new Schema({ 
    name: {type:String, required:true, unique:true}, 
    accessCode: String, 
    description: String, 
    //reference to User ID 
    members: [ObjectId], 
    comments: [Comment] 
}); 

이이

var trophy = new Trophy({...data...}); 

를 작동하는지 모르겠어 당신이 그것을처럼, 난 항상 이런 식으로 작업을 수행합니다

var trophy = new Trophy(); 
trophy.name = "my name"; 
// ... 

_id 빨리 설정해야합니다 개체를 만들 때 (http://stackoverflow.com/questions/6074245/node-mongoose-get-last-inserted-id).

그래서 그냥 이런 식으로 수행 트로피를 반환하지 않습니다 저장

trophy.save(function (err) { 
    if (err) { 
    if (err.toString().indexOf('duplicate key error index') !== -1) { 
     // check for duplicate name error ... 
    } 
    else { 
     // other errors 
    } 
    res.send('Error in trophy saving:' + err); 
    } 
    else { 
    User.findOne({_id:post.id}, function(err2, user) { 
     if (err2) {/* ... */} 
     else if (user) { 
     user.trophyLink = trophy._id; 
     res.send(user); 
     } 
    } 
    } 
}); 

중요합니다, 당신은 당신이 자신을 만든 하나를 사용합니다.

+0

이것은 작동하는 것으로 보입니다. 그 문제를 해결 한 err.toString() 부분이나 새 객체를 선언하는 방법이나 스키마에 수정을하는 방법에 대해서는 확신 할 수 없지만 감사합니다. – guiomie

+1

오브젝트를 선언하는 방식이 다음과 같음을 확인할 수 있습니다. - 새로운 Thing ({})을 수행 할 때 _id가 정의되지 않았습니다. - 새로운 Thing()을 수행하고 그 소품을 설정하면 효과가있었습니다. – postback