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
}
}
]
}
ここから平均を計算するのは、合計をカウントで割るだけです。ビュー自体で平均を計算したい場合は、この例を確認してください。