2016-02-08 15 views
7

新しいアグリゲーションパイプラインステージ$lookupでは、「左外部結合」を実行できるようになりました。一見

は、私はすぐに、2つの別々のコレクションでコレクションをdenormalised私たちのいずれかを交換し、照会時にそれらを結合するために$lookupを使用したいです。これにより、必要に応じて膨大な数の文書を更新するという問題が解決されます。これで、1つのドキュメントだけを更新できます。

確かにこれは本当に良いことですか?これは結局、NoSQLのドキュメントデータベースです!

のMongoDBのCTOもhighlights his concerns

我々はまだ$ルックアップは、リレーショナルデータベースのようにMongoDB を治療するために悪用される可能性があること心配しています。しかし、その利用可能性を制限する代わりに、 は、開発者がその使用が適切であると知っていることを助けるつもりで、 はアンチパターンです。今後数か月以内に、この分野での明確で強力な指針を提供するために、既存のドキュメント を超えることになります。

$lookupの制限はありますか?データをリアルタイムで操作可能なクエリで使用することができますか、オフラインの状況を報告するために残す必要がありますか?

答えて

4

私は同じ熱意を$lookupに共有しています。

私はトレードオフがあると思います。 SQLデータベースの主要な懸念事項の1つ(NoSQLの創造の理由の1つ)は、大規模な場合、結合には多くの時間がかかることがあります(よく、相対的に言えば)。

データの宣言型モデルを提供するのは間違いありませんが、NoSQLデータベース全体を行と表のデータベースとしてモデル化する場合(たとえば、refを使用している場合)は、あたかもそれを単なるSQLデータベース(ある程度)としてモデル化します。

MongoDBは、リレーショナルデータベースのようにMongoDBを扱うために誤用される可能性があるとも心配しています。

あなたは言及:

を。これは、必要なときに、文書の膨大な数を更新するために、持っていることの問題を解決します。これで、1つのドキュメントだけを更新できます。

あなたのコレクションが正確にどのように見えるか分かりませんが、確かにそれは$lookupのためによく使うことができるようです。

私はリアルタイムでそれらを使用することができ、私が言う

を照会操作は、再び、それはあなたのユースケースに依存します。あなたは比較する必要があります:特定の状況では、クエリの

  • 理想のセマンティクス(不可欠対宣言型)
  • をよりリレーショナルとしてデータをモデリング(したがって$lookupを使用して)かどうかの潜在的なトレードオフの価値があります計算時間...

などを

を(つまりは計算に言えば、コレクション全体に照会することも、心配するべきものであると仮定しています)私は今後数カ月以内に、我々はPERF TESが表示されます確信しています"左外部結合"のtsとおそらくMongoDBは、$lookupが反パターンであるときにいくつかの投稿を書き始めるでしょう。

この回答がディスカッションに役立つことを願っています。

4

まずMongoDBはドキュメントベースのデータベースであり、常にそうです。

を我々はまだ$ルックアップは、リレーショナルデータベースのようにMongoDBを治療するために悪用される可能性がことを懸念している:MongoDBののCTOが述べたように、バージョン3.2の新$lookup集約パイプラインステージは、リレーショナルデータベース(RDBMS)にはMongoDBを変更していません。収集を「参加」からの文書にフィルタリングする同じデータベースにunshardedコレクションに参加

左外側を実行します

文書で述べたように$lookupの最初の制限は、ということです処理。

これは、シャードされたコレクションでは使用できないことを意味します。

postで述べたようにまた$lookupオペレータは、それが配列の場合、したがって、あなたがlocalFieldを非正規化するために予備$unwind段階が必要になります配列を直接操作しません。

は今、あなたは言った:

これは時に必要な書類の膨大な数を更新するために、持っていることの問題を解決します。

データが頻繁に更新される場合は、これは良い考えです。特に大きな階層データセットがある場合は、6 Rules of Thumb for MongoDB Schema Design: Part 3に記載されている

これらのフィールドが更新されるよりも頻繁に読み取られると、1つ以上のフィールドを非正規化することは意味があります。

慎重にschema designと入力すると、おそらく$lookup演算子は必要ありません。

関連する問題