0

私はmongodbを初めて利用していますNoSQL概念と私の目的に最も役立つ可能性があるスキーマをモデル化するための決定をすることができない時点で立ち往生。投稿と共有のためのMongodbスキーマ

私は最終結果がであるようにスキームを設計する必要があります。投稿と株式は時間で並べ替えられます。共有コレクションのスキーマ

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    privacy: Number, 
    updatedOn: { type: Date, default: Date.now }   
}, { collection: 'posts' }); 

:ポスト収集のスキーマ

:としてさまざまな記事の収集と共有


オプション1:このため、私は2つの選択肢が考えられ

var shareSchema = mongoose.Schema({ 
    dis_Id: { type: mongoose.Schema.Types.ObjectId }, // Id of post that is shared 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date, default: Date.now } 
}, { collection: 'shares' }); 

オプション2:投稿に埋め込むシェア自体

ポストのための新しいスキーマ

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    updatedOn: { type: Date, default: Date.now }, 
    privacy: Number, 
    share: { 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date } 
    }  
}, { collection: 'posts' }); 

より良い選択かもしれないこれの今?オプション1は、mongodbに結合がなく、同じデータの複製につながり、何十万人ものユーザーのために何十億ものものになる可能性があるため、クエリに問題があります。

+0

第1の選択肢が実行可能でない理由については、まだ明確ではありません。私は、オンラインクエリのためにmongodbでは結合がサポートされていないことに同意します。ただし、この[post](https://stackoverflow.com/questions/5681851/mongodb-combine-data-from-multiple-collections-into-one-how)を使用すると、オフラインプロセスにjoinを使用できます。どのように第1のオプションは、目的を破る明確ではありません。あなたは精緻化できますか? –

+0

** MapReduce **テクニックは、最大** 16MBの**サイズの可能性がある** BSONドキュメント**を返すので、投稿あたりの投稿数と共有数が増え、結果ドキュメントのサイズは16MBになります –

+0

OK。私はmap-reduce usecaseに関してあなたに同意します。しかし、まだ私は第一の選択肢が役に立たない理由を理解できません。つまり、APIリクエストやユースケースを定義することができれば、より明確になります。 –

答えて

0

私は次のようなアプローチを提案する:

  1. すでにユーザ名を持っているので、あなたがsortを使用してソートされた順序でそのIDに対応するポストのリストを取得することができます。

  2. 各投稿を繰り返すことで、上で使用したのと同じ並べ替えを使用して、並べ替え順に共有を取得できます。

ここで重要なのは、設定するインデックスを理解することです。私はあなたが次のインデックスを持っているべきであることを提案する。

post_schema:{dis_Id、shareOn}に 複合インデックス:{ユーザー名、updatedOn}

share_schemaに 複合インデックス。

複合インデックスを使用しない場合、アプリケーションは多数のレコードに対して縮尺を変更しません。

+0

もう一つの問題があります。私は**投稿**と**共有**をそれぞれソート順で取得しますが、投稿と共有の混合でさらにソートする必要があります。 ** **例:**:9amに投稿されたif(A)は、3pmで共有されています(A1)、Bは12pmに投稿されています。 Uの論理によると、私はAよりBの方が良いですが、私はAからB、そしてA1の順が必要です。 –

+0

ok、私はこれらの株式/ポストをマージするカスタムロジックを書かなければならないことを理解しています。すべてのレコードを単一の行に追加する場合は、mongoのmap-reduce機能は役に立ちません。ただし、投稿/共有の単一レコードが1行になるように処理すると、これはMRを使用して行うことができます。結論を出すには、カスタムロジックを作成する必要があります。 –

0

組み込みドキュメントを使用すると、すべての必要なデータを一緒に取得できるので、オプション2が適しています。しかし、文書のサイズが16MB以上増加することが懸念される場合は、オプション1を使用してください。この場合、2つのコレクションを結合するために集約クエリを使用しないでください。これは、時間がかかる操作であるため、最初にすべての操作を実行し、操作をスキップします。代わりに、各コレクションを個別に照会し、カスタムロジックを使用して完全な応答を作成する必要があります。

+0

これを念頭に置いて、オプション2でこれをどうやって行うのですか?ここにもう一つの問題があります。私は投稿と共有をそれぞれソート順で取得しますが、投稿と共有の混合でさらにソートする必要があります。例:if(A)が9amに投稿されているが、3pmで共有されている(A1)とBが12pmに投稿されている。 Uロジックによると、私はAよりBを取得するでしょうが、私は注文AとBを必要とし、A1 –

+0

はカスタムコードを書く必要があります。必要なコレクションの両方からドキュメントを取得し、必要な順序でドキュメントをマージします。 – Ricky

+0

そして、それらをどのようにマージする必要がありますか?集計または他の方法を使用していますか? –

関連する問題