プロジェクトで使用するいくつかの異なるMap/Reduces関数があります。ただし、マップ機能にループが必要なため、1つは他の1つとは大きく異なります。そして、ループ内のカウントごとに、emitを送信します。
私が持っているのはこのシナリオです(ユーザーコレクション内):
"channels" : [
"Channel 1",
"Channel 2",
],
私がやりたいのは、各チャネルのユーザー数を数えることです。そのために使用することはできますdb.users.find({channels: "Channel 1"}).count()
が、残念ながらチャネルは動的です。つまり、可能なすべてのチャネル名がわからないため、将来変更される可能性があります。
だから私はMap/Reduceの仕事は完璧だと思いました。しかし、問題は、私が書いた最初のReduceジョブが間違って計算されたことです。そして、私が各送信に対してクエリを使用したもう1つは、永遠にかかるようになります(sshセッションがシャットダウンするまでに3時間以上かかります)。
だから今私は立ち往生していて助けが必要です。リアルタイムで実行するのがちょっと遅いクエリの束よりも優れているので、Map/Reduceジョブが欲しいと思います。
これは私が書いた最新Map
の関数です:Reduce
var map = function() {
if(this.channels) {
for(var i = 0, imax = this.channels.length; i<imax; i++) {
emit(this.channels[i], 1);
}
}
}
var reduce = function (key, values) {
var result = 0;
values.forEach(function (value) {
// had this before: result += 1;
result = db.users.find({'channels' : key}).count();
});
return result;
}
リデュース機能が恐ろしいことは知っていましたが、思いつく限りのことをしてみました。私の論理は間違っているように見えるかもしれませんが、良い解決策を見つけることができません。今、私はすべてのページの読み込みでたくさんのクエリを実行することを考えていますが、それは地獄のように遅くなります。
助けてください!:)