2016-11-11 5 views
0

私は他のSOの投稿を見てきましたが、これを行うためのさまざまな方法が見つかっています。私はこれを学生に教えているので、彼らにベストプラクティスを与えたいと思います。新しいアイテムをmongoDBドキュメント配列に貼り付ける

私は、次のBlogPostオブジェクト(簡体字)がある場合:

var BlogPostSchema = new mongoose.Schema({ 
    body: String, 
    comments: [String] 
}); 

を、私はこのブログのコメントの配列に新しいコメントを追加したい、私は達成するために、少なくとも3つの主な方法を考えることができます

1)Blogオブジェクトにコメントを「Angular」でプッシュし、/blogs/:blogIDエンドポイントにPUTリクエストを送信し、新しいコメントを含むブログオブジェクト全体を更新します。

2)、リクエストボディは、単に新しいコメントです/blogs/:blogID/commentsエンドポイントにPOST要求を提出するブログを見つけ、バニラJSで配列にコメントをプッシュし、それを保存します。

BlogPost.findById(req.params.blogID, function(err, blogPost) { 
    blogPost.comments.push(req.body); 
    blogPost.save(function(err) { 
     if (err) return res.status(500).send(err); 
     res.send(blogPost); 
    }); 
}); 

OR

3)は、その後、コメントの配列に称賛を追加するためにMongoDBの$push$addToSetを使用して、新しいコメントのリクエストボディとPOST/blogs/:blogID/commentsエンドポイントを提出してください:

BlogPost.findByIdAndUpdate(
    req.params.blogID, 
    {$push: {comments: req.body}}, 
    {safe: true, new: true}, 
    function(err, blogPost) { 
     if (err) return res.status(500).send(err); 
     res.send(blogPost); 
    }); 
}); 

私はthis stackoverflow postを見つけました。回答者はオプション2とオプション3について話していますが、基本的には可能な限りオプション2を使用するように言われています。 (そして、私は通常、フックやその他の雑用品を使用できないようにする方法を避けようとしています)

あなたはどう思いますか?何かアドバイス?

+0

私はオプション3に行きます.2と3の両方は基本的に同じです。オプション3では、findAndUpdateサーバー側が実行されます(更新されたドキュメントを返すサーバーへの呼び出しが1回発生します)。オプション2では、最初にblogPostを取得し、サーバーへの2回の呼び出しである更新をサーバーに送信します(.saveアクション)。 – HoefMeistert

答えて

1

アプリケーションの観点からは、ポイント3が優れています。私はそう思っている理由があります。

  1. クエリ自体は、達成しようとしているものを指定します。それは容易に読むことができる です。
  2. save関数はワイルドカードなので、変更する内容はわかりません。
  3. 文書を取り出して操作して保存した場合、文書の 他のフィールドが誤って操作中に を指し示している可能性があります。
  4. addToSetの場合、基本的に前の点がより目立ちます。
  5. 複数の呼び出しに同じブログに異なるコメントが付いていて、オプション2を試している場合は、 で行われた変更を上書きする可能性があります。それを保存します。オプション 3がその点で優れています。

パフォーマンスは賢明ですが、どちらも同じことを行うため、目立つ違いはありません。しかし、オプション3は少し安全で清潔です。

+0

私が懸念しているのは、保存前や保存後などにmongooseを使用する必要がある場合だけですが、 'findByIdAndUpdate'メソッドはそれをさせません。しかし、おそらく私はこれを今のところこのように書いているかもしれませんし、ある種のプリフックまたはポストフックの必要性を見いだすと、私はそれを切り替えます。思考をありがとう! – bobbyz

関連する問題