2012-11-16 7 views
5

私はノード+ Expressプロジェクトを実行している、私はノード+エクスプレスマングースのサブコレクションマニュアルを挿入

var Post = mongoose.Schema({ 
    title: String, 
    body: String, 
    author: String, 
    dateCreated: {type: Date, default: Date.now }, 
    comments: [{author: String, body: String, date: Date}] 
}); 
var Post = db.model('Post', Post); 

を以下のスキーマの基本的なブログシステムを構築し、モデル午前私は、次のコードを経由してポストの要求を受け入れ、

app.post('/addpost', function(req,res){ 
    console.log(req.body.post); 
    var post = new Post(req.body.post); 
    post.save(function(err){ 
     if(!err){ 
      res.redirect('/'); 
     }else{ 
      res.redirect('/'); 
     } 
    }) 
}) 

私が持っている質問は、私がすでに開発したコーダを使ってスキーマにコメントを追加するにはどうすればいいですか?マングースのために明らかに許容可能であるが、コメントを追加するためにどのように私はこれについて行くだろう

req.body.post出力

{ title: 'Hello World', body: 'This is a body', author: 'Bioshox' } 

ありがとうございます!新しいコメントが、それ以外の場合は、最初のコメントでブログ記事を追加し、その後$pushそれが成功場合

var comment = { 
    author: req.body.post.author , 
    body: req.body.post.body, 
    date: new Date() 
}; 

Post.findOneAndUpdate(
    { title: req.body.post.title }, 
    { $push: { comments: comment }}, 
    { safe: true, upsert: true }, 
    function(err, blogModels) { 
    // Handle err 
    }); 

このコードは、単に、Blogポストを探してみてください:

答えて

12

は、次のコードスニペットを使用することができます。最終的なコードは次のようになります:

app.post('/addpost', function(req,res) { 
    var comment = { 
     author: req.body.post.author , 
     body: req.body.post.body, 
     date: new Date() 
    }; 

    Post.findOneAndUpdate(
     { title: req.body.post.title }, 
     { $push: { comments: comment }}, 
     { safe: true, upsert: true }, 
     function(err, blogModels) { 
     // Handle err 
     }); 
}); 
+0

「upsert」とは何ですか? – chovy

+3

'upsert'プロパティが' true'ならば、mongoは最初に一致する 'title:req.body.post.title'基準を持つ文書を見つけようとします。もしそうなら、文書を '{$ push ...}'で更新するだけです。さもなければ、mongoは新しい文書を作成し、それを挿入し$最初のコメントinitを押します。 詳細情報:http://docs.mongodb.org/manual/reference/command/findAndModify/ –

+0

実際に私はupsertがそのタイトルの** Post **を見つけ出すように見えます。存在しなければPostを作成しますコメントではありません – mrBorna