2011-08-03 19 views
1

私のコレクションに文書を保存しようとしていますが、保存が成功した場合は、この同じ文書の_idを返してください。問題は、どちらの場合でも、mongooseから作成されたモデルか、コールバック関数のどちらかで、_idに未定義の値が得られることです。基本的に、_idを取得する唯一の方法は、そのプロパティの1つでドキュメントを検索してから値を取得することです。このアプローチは、私が欲しいものではなく、現在何をしようとしているのがうまくいくかを知っています。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'); 
      } 
     }); 
     } 
    }); 
    } 
    }); 
}); 

スキーマ

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

答えて

2

あなたはそれが自動的に生成されます、あなたのスキーマに_idを供給する必要はありません。名前を一意にするには、スキーマでこれを設定することもできます。 membersが "本当の"ユーザー_IDであると思われる場合は、のように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

関連する問題