マングース101 :人口
18689 ワード
MongoDB文書のサイズ制限は16 MBです.これは、サブドキュメント(または埋め込まれたドキュメント)を使用することができます小さい場合は、数が少ない.
たとえば、ストリートファイターの文字の動きの数が限られている.フローのみ4特別な動きがあります.この場合、直接Loveの文字文書にembed動きを使用するのは大丈夫です.
しかし、サブドキュメントの数を制限することができますデータを持っている場合は、別のデータベースを設計する必要があります.
つの方法は、2つの別々のモデルを作成し、それらをpopulateと組み合わせることです.
ブログを作りたいとしましょう.そして、あなたはmongodbでブログ内容を保存したいです.各ブログのタイトル、コンテンツ、およびコメントがあります.
最初のスキーマは次のようになります.
ブログ投稿は、無制限の数のコメントを持つことができます.ブログポストが人気で爆発して、コメントが膨らむならば、文書はMongoDBによって課される16 MBの制限を上回るかもしれません.
これはブログ投稿にコメントを埋め込むべきではない.コメントの別のコレクションを作成する必要があります.
人口を使うには、 セット セット ここで我々は欲しい
あなたがブログ記事を作成したいとしましょう.ブログ投稿を作成するには
さあ、ブログ記事のコメントを作りたいです.これを行うには、コメントを作成して保存します.
保存されたコメントが
ブログ投稿を検索しようとすると、ブログ投稿にコメントIDの配列が表示されます.
コメントを得るには4つの方法があります. マングース人口 マニュアルウェイ マニュアルウェイ マニュアルウェイ
Mongooseでは、リンクされた文書を
Populateを呼び出すと、
マングース人口がなければ、手動でコメントを見つける必要があります.まず、コメントの配列を取得する必要があります.
マングースはあなたに
マニュアルのやり方をしなければならないのなら、マニュアルの上でマニュアル1を好む.
番目のメソッドでは、スキーマを変更する必要があります.コメントを保存するときは、コメントをブログ記事にリンクします.
マニュアルでは、マニュアル1とマニュアル1と2以上のマニュアルがあります.
そして、人口はすべての3つのマニュアル方法を打ちます.
読書ありがとう.この記事はもともと投稿されたmy blog . あなたがより良いフロントエンド開発者になるために、より多くの記事が欲しいならば、私の会報にサインアップしてください.
たとえば、ストリートファイターの文字の動きの数が限られている.フローのみ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 . あなたがより良いフロントエンド開発者になるために、より多くの記事が欲しいならば、私の会報にサインアップしてください.
Reference
この問題について(マングース101 :人口), 我々は、より多くの情報をここで見つけました https://dev.to/zellwk/mongoose-101-population-3b80テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol