2016-06-26 9 views
0

私はMongo/Mongooseで本当に新しく、私のモデルでは、関係のあるいくつかのモデル(1対1、1対多、多対多)を遭遇するかもしれません。同じコレクション内またはドキュメントによって:Mongo/Mongoose、relationship storage

Understanding Relationships & Foreign Keys in Mongoose

しかし、モンゴドキュメントによると、関係を格納するための2つの方法があります:私は以下のようなマングースの関係を作成する方法についていくつかの良い例が調査してきました参照。

https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/

私はこのトピックに関する3つの質問を持っています。

1-いつアプローチを使用する必要がありますか?これは私のビジネスデータの要件と検索の実行方法に基づいていますか? 2両方のタイプのデータストレージを組み合わせることをお勧めしますか? 3同じコレクション内またはドキュメント参照としてリレーションシップデータを格納するようにMongooseを設定するにはどうすればよいですか?

どうもありがとう

答えて

1

あなたが関係を使用する場合は、SQLを好きではない場合、あなたは、あなたがRet​​hinkDBのようなデータベースを使用することができ、MySQLのようなリレーショナルデータベースを使用する必要があり、モンゴ中関係がグラグラしています。それで、私はあなたの質問に私の知る限りで答えようとします。

1 - アプローチはいつ別のものを使うべきですか?

IMOの場合、できるだけデータを別にしておく必要があります。たとえば、ブログでは、自分のコレクション内にコメントと投稿を残しておき、Commentsコレクションに対するhasMany関係として投稿を参照したいとします。はい、投稿記事にコメントを追加するだけで、ユーザーが自分のコメントを見ることができるようにする方法を追加したいとします。次に、各投稿のコメントを見るためのクエリを作成し、それはちょうど悪いです。

2 - 両方の種類のデータストレージを組み合わせることをお勧めしますか?

この質問は、最初の1

3と同じであると考えられる - どのように私は、同じコレクション内または文書リファレンスとして関係データを保存するためにマングースを設定することができますか?

最初に何かを明らかにする、Mongoはドキュメントをコレクション内に格納します。 ドキュメント内にリレーションを持たせるには、そのドキュメントにプロパティが追加される場所にプロパティを追加します。ブログの例:アプリケーションが静的に同じになり、あなたがスケーラビリティを気にしない場合

import mongoose from 'mongoose' 

const Schema = mongoose.Schema 

const postSchema = new Schema({ 
    title: String, 
    date: String, 
    author: String, 
    text: String, 
    comments: Array 
}) 
export default mongoose.model('Post', postSchema); 

さて、これはそれを行うためのシンプルな、より良い方法のように見えるかもしれません。私がお勧めするのは、あなたの懸念を分けておくことです。

この例のスキーマに基づいて、authorcommentsは独自のコレクションである必要があります。

著者は(多くの記事を持っている多くのコメントがあります)

import mongoose from 'mongoose' 

const Schema = mongoose.Schema 

const authorSchema = new Schema({ 
    name: String, 
    posts: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Post' 
    }], 
    comments: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Comment' 
    }] 
}) 
export default mongoose.model('Author', authorSchema); 

コメントは(作者に属し、つのポストを持っている)

import mongoose from 'mongoose' 

const Schema = mongoose.Schema 

const commentSchema = new Schema({ 
    author: { 
     type: Schema.Types.ObjectId 
     ref: 'Author' 
    }, 
    post:{ 
     type: Schema.Types.ObjectId, 
     ref: 'Post' 
    } 
}) 
export default mongoose.model('Comment', commentSchema); 

投稿(作者に属し、多くのコメントがあります)

import mongoose from 'mongoose' 

const Schema = mongoose.Schema 

const postsSchema = new Schema({ 
    author: { 
     type: Schema.Types.ObjectId 
     ref: 'Author' 
    }, 
    title: String, 
    date: String, 
    text: String, 
    comments: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'Comment' 
    }] 
}) 
export default mongoose.model('Post', postsSchema); 
+0

うわー、あなたの偉大な答えをありがとう@バーチュー、それは今、多くの意味があります。私はSQLの世界であり、「非リレーショナル」スキーマの関係を理解するのはちょっと混乱していました。ありがとうございました –

+0

Ohh btw @Baruch ...これはあなたに役立つ場合に役立つ、この関係に関する記事です。http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for -mongodb-schema-design-part-1 –

+0

@DavidEspino共有してくれてありがとう。私は6ヶ月のようにMongoを使っていない。私はそれを試してみました、RethinkDBが恋に落ちていました。しかし、現時点では、私の仕事には私が気にしないMySQLを使用する必要があります。 – Baruch