CouchDB で作成した Map/Reduce ビューに対して Java からクエリを実行しようとしています。私のマップ関数は次のようになります。
function(doc) {
if(doc.type == 'SPECIFIC_DOC_TYPE_NAME' && doc.userID){
for(var g in doc.groupList){
emit([doc.userID,doc.groupList[g].name],1);
}
}
}
リデュース機能:
function (key, values, rereduce) {
return sum(values);
}
ビューは、Futon インターフェイスから実行されたときに機能しているようです (ただし、キーは指定されていません)。私がやろうとしているのは、単一のグループに属するドキュメント タイプの数を数えることです。「userID」とグループの名前をキーとして使用して、そのビューを照会したいと思います。
CouchDB データを管理するために Ektorp ライブラリを使用しています。キーなしでこのクエリを実行すると、スカラー値が返されます。それ以外の場合は、reduce クエリに対して group=true を指定する必要があるというエラーが出力されます。
私は次のことを試しました:
ViewQuery query = createQuery("some_doc_name");
List<String> keys = new ArrayList<String>();
keys.add(grupaName);
keys.add(uzytkownikID);
query.group(true);
query.groupLevel(2);
query.dbPath(db.path());
query.designDocId(stdDesignDocumentId);
query.keys(keys);
ViewResult r = db.queryView(query);
return r.getRows().get(0).getValueAsInt();
上記の例は、「キー」が指定されていなくても機能します。次のようなComplexKeyを使用する他のクエリがあります。
ComplexKey key = ComplexKey.of(userID);
return queryView("list_by_userID",key);
しかし、これはタイプ T (List) のリストのみを返します - もちろん CouchDbRepositorySupport を使用します - そして、reduce タイプのクエリでは使用できません (私が知っていることから)。
Ektorp ライブラリを使用して、reduce 関数を指定し、2 つ以上の値を持つ複雑なキーでクエリを実行する方法はありますか? どの例も高く評価されています。