2011-11-03 34 views
10

埋め込みドキュメントの更新に問題があります。マングース埋め込みドキュメント更新

マイ定義されたスキーマ:

var Talk = new Schema({ 
    title: { 
     type: String, 
     required: true 
    }, 
    content: { 
     type: String, 
     required: true 
    }, 
    date: { 
     type: Date, 
     required: true 
    }, 
    comments: { 
     type: [Comments], 
     required: false 
    }, 
    vote: { 
     type: [VoteOptions], 
     required: false 
    }, 
}); 

var VoteOptions = new Schema({ 
    option: { 
     type: String, 
     required: true 
    }, 
    count: { 
     type: Number, 
     required: false 
    } 
}); 

今、私は与えられたTalk idとVoteOption IDで、vote.count++を更新したいと思います。私は仕事をするには、次の機能を持っている:

function makeVote(req, res) { 

    Talk.findOne(req.params.id, function(err, talk) { 
     for (var i = 0; i < talk.vote.length; i++) { 
      if (talk.vote[i]._id == req.body.vote) { 
       talk.vote[i].count++; 

      } 
     } 
     talk.save(function(err) { 
      if (err) { 
       req.flash('error', 'Error: ' + err); 
       res.send('false'); 
      } else { 
       res.send('true'); 
      } 
     }); 
    }); 
} 

すべては私がres.send('true')を取り戻す、実行されますが、カウント数の値は変更されません。

console.log私はそれが値を変更したのを見ましたが、talk.saveはdbに保存しません。

また、埋め込みドキュメントの_idを見つけるだけのサイクルについては、私は非常に不満です。 mongooseのドキュメントで私はtalk.vote.id(my_id)について読んでいますが、それは私にidの機能を持たないというエラーを与えてくれます。

答えて

19

Mixedタイプ(基本タイプ以外のもので、埋め込みドキュメントも含むように思われる)を更新する場合は、ドキュメント上で.markModifiedを呼び出す必要があります。この場合、次のようになります。

talk.markModified("vote"); // mention that `talk.vote` has been modified 

talk.save(function(err) { 
    // ... 
}); 

これは、私が非常に迅速に答えを見つけることができなかったので、これは将来的に誰かに役立つことを願っています。


Reference:

...マングースは、オートそれらの変更を保存/検出する能力を失います。混合型の値が変更されたことをMongooseに伝えるには、ドキュメントの.markModified(path)メソッドを呼び出して、変更したばかりの混合型へのパスを渡します。

+0

今日のヒーロー! – MrBr

0

これは、カウントをインクリメントするコールバックが発生する前にトークオブジェクトを保存しようとしているためです。また、トークスキーマをインスタンス化することを確認しましたか?例えば: :

talk.find({ _id : req.body.vote }, { $inc: { count : 1 } }); 

が見て:あなたがしたいすべての増分がある場合

var talk = new Talk(); 

しかし、あなたのカウント変数は、モンゴはあなたが役に立つかもしれ原子、インプレース更新をサポートしています

関連する問題