私は、MongoDB 内でも mapReduce と集計に少し慣れていません。
データセットの例を次に示します。
{ "_id" : ObjectId("521002161e0787522098d110"), "userId" : 4545454, "pickId" : 1, "answerArray" : [ "yes" ], "city" : "New York", "state" : "New York" }
{ "_id" : ObjectId("521002481e0787522098d111"), "userId" : 64545454, "pickId" : 1, "answerArray" : [ "no" ], "city" : "New York", "state" : "New York" }
{ "_id" : ObjectId("521002871e0787522098d112"), "userId" : 78263636, "pickId" : 1, "answerArray" : [ "yes" ], "city" : "Albany", "state" : "New York" }
{ "_id" : ObjectId("5211507c1e0787522098d113"), "userId" : 78263636, "pickId" : 2, "answerArray" : [ "yes" ], "city" : "New York", "state" : "New York" }
{ "_id" : ObjectId("5211507c1e0787522098d113"), "userId" : 78263636, "pickId" : 1, "answerArray" : [ "yes" ], "city" : "Wichita", "state" : "Kansas" }
州、都市、pickId、answerArray の一意の値のリストを取得し、それらの一意の組み合わせを数えたいと考えています。結果は次のようになります。
{"pickId": 1, "city": "New York", "state": "New York", "answerArray": ["yes"], "count":2}
{"pickId": 1, "city": "Albany", "state": "New York", "answerArray": ["no"], "count":1}
{"pickId": 1, "city": "New York", "state": "New York", "answerArray": ["no"], "count":1}
{"pickId": 1, "city": "Wichita", "state": "Kansas", "answerArray": ["yes"], "count":1}
私が抱えている問題は、mapReduce が 2 つの引数しかとらないことです。
Error: fast_emit takes 2 args near...
しかし、複数の一意の値を 1 つの pickId にマップしようとしています。
私が見ているmapReduceのコードは次のとおりです。
var mapFunct = function() {
if(this.answerArray == "yes"){
emit(this.pickId,1);}
else{
emit(this.pickId,0);};}
var mapReduce2 = function(keyPickId,answerVals){
return Array.sum(answerVals);};
db.answers.mapReduce( mapFunct, mapReduce2, { out: "mapReduceAnswers"})
任意のヘルプまたはさらなる提案をいただければ幸いです。集約フレームワークも調べましたが、必要な種類の出力が得られるとは思えません。