マングース101 :人口


MongoDB文書のサイズ制限は16 MBです.これは、サブドキュメント(または埋め込まれたドキュメント)を使用することができます小さい場合は、数が少ない.
たとえば、ストリートファイターの文字の動きの数が限られている.フローのみ4特別な動きがあります.この場合、直接Loveの文字文書にembed動きを使用するのは大丈夫です.

しかし、サブドキュメントの数を制限することができますデータを持っている場合は、別のデータベースを設計する必要があります.
つの方法は、2つの別々のモデルを作成し、それらをpopulateと組み合わせることです.

モデルの作成


ブログを作りたいとしましょう.そして、あなたはmongodbでブログ内容を保存したいです.各ブログのタイトル、コンテンツ、およびコメントがあります.
最初のスキーマは次のようになります.
const blogPostSchema = new Schema({
  title: String,
  content: String,
  comments: [
    {
      comment: String
    }
  ]
});

module.exports = mongoose.model("BlogPost", blogPostSchema);
このスキーマに問題があります.
ブログ投稿は、無制限の数のコメントを持つことができます.ブログポストが人気で爆発して、コメントが膨らむならば、文書はMongoDBによって課される16 MBの制限を上回るかもしれません.
これはブログ投稿にコメントを埋め込むべきではない.コメントの別のコレクションを作成する必要があります.
const comments = new Schema({
  comment: String
});

module.exports = mongoose.model("Comment", commentSchema);
マングースでは、2つのモデルを人口でリンクできます.
人口を使うには、
  • セットtype 財産のSchema.Types.ObjectId
  • セットref モデルにもリンクしたい.
  • ここで我々は欲しいcomments インblogPostSchema コメントコレクションにリンクするにはこれは使用するスキーマです.
    const blogPostSchema = new Schema({
      title: String,
      content: String,
      comments: [{ type: Schema.Types.ObjectId, ref: "Comment" }]
    });
    
    module.exports = mongoose.model("BlogPost", blogPostSchema);
    

    ブログ投稿の作成


    あなたがブログ記事を作成したいとしましょう.ブログ投稿を作成するにはnew BlogPost .
    const blogPost = new BlogPost({
      title: "Weather",
      content: `How's the weather today?`
    });
    
    ブログ投稿にはゼロコメントがあります.我々はこのブログのポストを保存することができますsave .
    const doc = await blogPost.save();
    console.log(doc);
    

    コメントの作成


    さあ、ブログ記事のコメントを作りたいです.これを行うには、コメントを作成して保存します.
    const comment = new Comment({
      comment: `It's damn hot today`
    });
    
    const savedComment = await comment.save();
    console.log(savedComment);
    

    保存されたコメントが_id 属性.これを加える必要がある_id ブログポストへの属性comments 配列.これはリンクを作成します.
    // Saves comment to Database
    const savedComment = await comment.save();
    
    // Adds comment to blog post
    // Then saves blog post to database
    const blogPost = await BlogPost.findOne({ title: "Weather" });
    blogPost.comments.push(savedComment._id);
    const savedPost = await blogPost.save();
    console.log(savedPost);
    
    ブログ投稿.

    ブログ記事の検索とそのコメント


    ブログ投稿を検索しようとすると、ブログ投稿にコメントIDの配列が表示されます.
    const blogPost = await BlogPost.findOne({ title: "Weather" });
    console.log(blogPost);
    

    コメントを得るには4つの方法があります.
  • マングース人口
  • マニュアルウェイ
  • マニュアルウェイ
  • マニュアルウェイ
  • マングース人口


    Mongooseでは、リンクされた文書をpopulate メソッド.何をする必要がありますコール.populate を実行するとfindOne .
    Populateを呼び出すと、key 設定したいプロパティの.この場合、key is comments . (注:マングースはこれを呼び出しますkey "path ").
    const blogPost = await BlogPost.findOne({ title: "Weather" }).populate(
      "comments"
    );
    console.log(blogPost);
    

    マニュアルウェイ(方法1)


    マングース人口がなければ、手動でコメントを見つける必要があります.まず、コメントの配列を取得する必要があります.
    const blogPost = await BlogPost.findOne({ title: "Weather" }).populate(
      "comments"
    );
    const commentIDs = blogPost.comments;
    
    その後、ループを介してcommentIDs それぞれのコメントを見つける.あなたがこの方法で行くならば、それは使用にわずかにより速いですPromise.all .
    const commentPromises = commentIDs.map(_id => {
      return Comment.findOne({ _id });
    });
    const comments = await Promise.all(commentPromises);
    console.log(comments);
    

    マニュアルウェイ(メソッド2 )


    マングースはあなたに$in 演算子.これが使えます$in 演算子を配列内のすべてのコメントを検索します.この構文は使用するために努力をします.
    マニュアルのやり方をしなければならないのなら、マニュアルの上でマニュアル1を好む.
    const commentIDs = blogPost.comments;
    const comments = await Comment.find({
      _id: { $in: commentIDs }
    });
    
    console.log(comments);
    

    マニュアルウェイ(メソッド3 )


    番目のメソッドでは、スキーマを変更する必要があります.コメントを保存するときは、コメントをブログ記事にリンクします.
    // Linking comments to blog post
    const commentSchema = new Schema({
      comment: String
      blogPost: [{ type: Schema.Types.ObjectId, ref: 'BlogPost' }]
    })
    
    module.exports = mongoose.model('Comment', commentSchema)
    
    あなたはブログのポストにコメントを保存し、コメントにブログの投稿IDを必要があります.
    const blogPost = await BlogPost.findOne({ title: "Weather" });
    
    // Saves comment
    const comment = new Comment({
      comment: `It's damn hot today`,
      blogPost: blogPost._id
    });
    const savedComment = comment.save();
    
    // Links blog post to comment
    blogPost.comments.push(savedComment._id);
    await blogPost.save();
    
    これを行うと、ブログ投稿のIDに一致するコメントのコレクションを検索できます.
    // Searches for comments
    const blogPost = await BlogPost.findOne({ title: "Weather" });
    const comments = await Comment.find({ _id: blogPost._id });
    console.log(comments);
    

    マニュアルでは、マニュアル1とマニュアル1と2以上のマニュアルがあります.
    そして、人口はすべての3つのマニュアル方法を打ちます.
    読書ありがとう.この記事はもともと投稿されたmy blog . あなたがより良いフロントエンド開発者になるために、より多くの記事が欲しいならば、私の会報にサインアップしてください.