CouchDBを使用しています。クエリ時に指定できる日付範囲内の特定のフィールドの値の発生をカウントできるようにしたいと思います。私はこれの一部を行うことができるようですが、それをすべてまとめる最良の方法を理解するのに苦労しています。
タイムスタンプフィールドと別のフィールドを持つドキュメントを想定します。例:
{ date: '20120101-1853', author: 'bart' }
{ date: '20120102-1850', author: 'homer'}
{ date: '20120103-2359', author: 'homer'}
{ date: '20120104-1200', author: 'lisa'}
{ date: '20120815-1250', author: 'lisa'}
柔軟な日付範囲でドキュメントをフィルタリングするビューを簡単に作成できます。これは、以下のようなビューを使用して実行できます。たとえば、キー範囲パラメータを使用して呼び出されます_view/all-docs?startkey=20120101-0000&endkey=20120201-0000
。
all-docs / map.js:
function(doc) {
emit(doc.date, doc);
}
上記のデータを使用すると、最初の4つのドキュメント(日付範囲内の唯一のドキュメント)のみを含むCouchDBビューが返されます。
このように、グループ化して呼び出される、特定のフィールドの発生をカウントするクエリを作成することもできます_view/author-count?group=true
。
author-count / map.js:
function(doc) {
emit(doc.author, 1);
}
author-count / reduce.js:
function(keys, values, rereduce) {
return sum(values);
}
これにより、次のようになります。
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":2}
]
}
ただし、日付でフィルタリングし、発生をカウントするための最良の方法を見つけることができません。たとえば、上記のデータを使用して、次のような範囲パラメータを指定し、次startkey=20120101-0000&endkey=20120201-0000
のような結果を取得できるようにしたいと思います。最後のドキュメントは、指定された日付範囲外であるため、カウントから除外されます。
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":1}
]
}
これを行うための最もエレガントな方法は何ですか?これは単一のクエリで達成できますか?別のCouchDB構造を使用する必要がありますか、それともビューで十分ですか?