2016-10-29 8 views
0

私は、エンドユーザーにいくつかのアドホックレポート機能を提供するアプリケーション(Meteorに組み込まれています)を持っています。私は、集約パイプラインを使用して特定のクエリの結果を生成することによって、その機能を構築しました。これは非常に高速になり、私は$outを使用して結果を結果テーブルにプッシュしました。MongoDBのコレクションを動的に作成したり削除したりしてスケーラビリティの問題を起こすことはありますか?

結果テーブルは、クライアントが正しい結果そのうち把握するために使用されるQUERYIDを含ま。

残念ながら、$outが新しいクエリを挿入する前に結果テーブル全体を削除するため、一度に複数のユーザーがレポートを実行すると、うまくいきません。

  1. 集約を実行しますが、手動で
  2. $out(動的衝突を避けるために命名)の一時的なコレクションに結果をし、その後は手動でコピー結果のコレクションに結果をプッシュ:

    私は、次の3つの回避策を参照してくださいそこから結果を収集し、すぐに一時的なものを削除します。これはcopyTo()を使うことができると思ったときには意味がありましたが、それはMeteor内では不可能と思われるので、このオプションは#1に比べてあまり意味がないと思います。

  3. $out結果(動的衝突を避けるために命名)の一時的なコレクションに、クライアントがそこから直接、その結果を引き出しています。私は定期的に余分なコレクションを24時間後に削除します(今日のメインコレクションの特定のクエリ結果と同じように)。

#3が最も高速です。手動で行をコピーするのにかかる時間は、クエリの実行にかかる時間を短縮します。しかし、私は非常に多くのコレクションの作成と削除の影響について懸念しています。

ここでは何百万ものユーザーを話していないが、500ユーザーの平均的な一日は、実行中の各10-20レポートであれば、いずれかの時点で、データベースの追加5-10kのコレクションがあるかもしれません。それはたくさんのようだ。おそらく、ユーザーがさまざまなレポートを開いて複数のタブを開くことが必要な場合があるため、ただちに削除することはできませんが、何らかの方法でそれらをクリーニングするほうが賢明かもしれません。それでも、数百から数千のコレクションについて話しています。

これは問題になるのでしょうか?

代わりに私が検討すべき他のアプローチはありますか?

その他のおすすめ?

ありがとうございます!

答えて

1

スタックのMongoDBでコレクションを削除アポロで行うことができますモンゴ/ MySQLのハイブリッド・データベース上Graphqlを使用することですより大きなコレクション。 コレクションの最大数はかなり高く、MMAPv1のネームスペースnamespaceによってのみ制限され、ワイヤタイガーエンジンにはハードリミットは存在しません。 あなたの解決策#3が好きです。あなたが考えることができる いくつかの改良/代替案:

  1. 、あなたは、個々のコレクションをドロップすることなく、一回の操作でデータベース全体をドロップすることができます(1日と言う)を分離、データベース内のコレクションを作成することを検討してください。
  2. 結果セットにエンドポイントを使用し、結果をキャッシュしてから$ outコレクションを削除します。キャッシュにユーザーの要件を処理させ、キャッシュが期限切れになった場合にのみ、集約を再実行します。
0

この種のアクティビティは、mysqlやpgsqlなどのリレーショナルデータベースで非常に簡単に実行されます。レポートの目的で、データを別のリレーショナル・データベースに同期することを検討することもできます。

同期を提供すると主張パッケージhttps://github.com/perak/mysql-shadowがあります。私はそれと一緒に遊んだが、それは完全には動作しませんでしたが、一方向の同期だけで成功する可能性は高いです。

他のオプションは、とにかくはるかに効率的で、いくつかの文書を削除するよりも、非常に効率的な操作であるhttp://www.apollodata.com/

関連する問題