6

私はこのチャートを見ています...

http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,+MySQL+Compare+Grid

...これは言う:

クエリメソッド

CouchDB-クエリごとにインデックスを遅延構築するためのjavascript関数のマップ/リデュース

MongoDB-動的; オブジェクトベースのクエリ言語

これは正確にはどういう意味ですか?たとえば、平均1,000,000,000の値を取得したい場合、CouchDBは自動的にMapReduceの方法でそれを実行しますか?

誰かが両方のシステムで平均1,000,000,000の値を取得する方法を教えてもらえますか...これは非常に明るい例です。

ありがとう。

4

2 に答える 2

9

MongoDB について話すことはできませんが、CouchDB については話すことができます。CouchDB は、Map/Reduce ビュー エンジンを介してのみネイティブにクエリできます。実際、開始するのに最適な場所は wiki のこのセクションです。

ビューにはmap関数とオプションの reduce関数が含まれています。これらの関数を作成するための一般的な言語は JavaScript ですが、Erlang オプションも利用可能で、ビュー エンジンを他のほぼすべてのプログラミング言語で構築することができます。

map 関数は、データベース内の文書からデータセットを構築するのに役立ちます。reduce 関数は、そのデータセットを集約するのに役立ちます。そのため、ビューが作成されると、データベース内のすべてのドキュメントに対して map 関数が実行されます。(そして最初に照会されます)作成後、その関数は、新しく作成されたドキュメント、または変更/削除されたドキュメントでのみ実行されます。そのため、ビュー インデックスは動的ではなく増分的に構築されます。

1,000,000,000 個の値の場合、CouchDB はクエリがリクエストされるたびにその結果を計算する必要はありません。代わりに、保存されているビュー インデックスの値のみをレポートします。ビュー インデックス自体は、ドキュメントが作成/更新/削除されるたびにのみ変更されます。

Map/Reduce 関数を記述する限り、組み込みの map 関数がないため、その作業の多くはプログラマーに任されています。(つまり、「自動」ではありません) ただし、利用可能なネイティブの reduce 関数( _sum_count_stats) がいくつかあります。

これは簡単な例です。何人かの人の平均身長を計算します。

// sample documents
{ "_id": "Dominic Barnes", "height": 64 }
{ "_id": "Some Tall Guy", "height": 75 }
{ "_id": "Some Short(er) Guy", "height": 58 }

// map function
function (doc) {
  // first param is "key", which we do not need since `_id` is stored anyways
  emit(null, doc.height);
}

// reduce function
_stats

このビューの結果は次のようになります。

{
  "rows": [
    {
      "key": null
      "value": {
        "sum": 197,
        "count": 3,
        "min": 58,
        "max": 75,
        "sumsqr": 13085
      }
    }
  ]
}

ここから平均を計算するのは、合計をカウントで割るだけです。ビュー自体で平均を計算したい場合は、この例を確認してください。

于 2011-07-13T13:42:47.060 に答える
9

CouchDB のビューは奇妙で魅力的な野獣です。

CouchDB はインクリメンタル マップ/リデュースを行います。つまり、「ビュー」を指定すると、リレーショナル データベースからマテリアライズド ビューのように機能します。平均して 30 億または 30 億のドキュメントがあるかどうかは問題ではありません。結果はそこにあります。

しかし、そこには 3 つの落とし穴があります。

1)ビューが作成されて更新されると、クエリは高速になります。小さなドキュメントがたくさんある場合、ビューの作成が遅くなる可能性があります (可能であれば、より大きなドキュメントを使用してください)。ビューが作成されると、中間削減ステップが B ツリー ノード内に格納されるため、それらを再計算する必要はありません。

2) クエリを実行すると、ビューが遅延更新されます。予測可能なパフォーマンスを得るには、何らかのジョブをセットアップして定期的に更新することをお勧めします。 CouchDB でインデックスの更新をスケジュールする方法

3) 複合キー、範囲、およびグループ化を使用してデータをクエリする方法について、かなり良いアイデアを持っている必要があります。CouchDB は、アドホック クエリを実行するのが苦手です。 http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

両方のデータベースで 1,000,000,000 個のアイテムを平均化する方法の詳細を誰かがすぐに投稿すると確信していますが、CouchDB では、漸進的なアプローチの恩恵を受けるために、より多くの事前作業を行う必要があることを理解する必要があります。これは非常にユニークなものですが、アドホックにクエリされたデータに対して平均や何かを行っている場合のシナリオを意図したものではありません。

Mongo では、map/reduce (インクリメンタルではありません。30 億または 30 億のドキュメントを平均しているかどうかは重要ですが、mongo はメモリ マップド I/O アプローチにより非常に高速であると考えられています) またはそれらの集約機能のいずれかを使用できます。http://www.mongodb.org/display/DOCS/Aggregation

于 2011-07-13T13:46:10.197 に答える