私はmapReduceを学んでいます。私は、以下のmap reduce関数をユーザの集合に対して呼び出すようにしました。MongoのMapReduce配列を分割して再結合
function() {
m = function() {
emit(this.city, {num:1, arr:this});
}
r = function (key, arr_values) {
var resultArray = [];
var count = 0;
arr_values.forEach(function (value) {
resultArray.push(value);
count++;
});
return {num:count, arr:resultArray};
}
res = db.AdsOnPage.mapReduce(m, r, {out:"ReducedCollection"});
}
これは、私が必要とするもの、つまり「都市」をキーとし、その都市のユーザの配列を値として与えることになります。しかし、それは実際にはネストされた配列の不条理な数で私にそれを与えています。私はこれがシャーディングの結果として起こると思いますか?しかし、私はどのようにすべてに戻ってきますか?現在、結果は次のようになります。
{
"city":"Chicago",
"value" : {
"num" : 2.0,
"arr" : [{
"num" : 2.0,
"arr" : [{
"num" : 1.0,
"arr" : [{
<user doc is here>
}]
}, {
"num" : 1.0,
"arr" : [{
<user doc is here>
}]
}]
}
.......
for many many arrays
なぜこのようなことが起こりますか?私の結果を一貫した単一アレイに再結合する方法はありますか?
ありがとう、@ゲート。しかし、実際の問題は、ネスティングを解決した後でも、私の結果が複数の配列に分割されて返されているという事実です。あなたは「それらを正しく組み合わせる」と言います。どうすればいい? – carlbenson
'reduce'メソッドでは' arr_values'は値の配列です。各値は、それ自身が配列です。だから 'resultArray.push(value);'を実行することはできません。プッシュしている 'value'は配列です。したがって、各値をループする 'reduce'の内部に別のループが必要です。 –