1

プロジェクトで使用するいくつかの異なる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;
}

リデュース機能が恐ろしいことは知っていましたが、思いつく限りのことをしてみました。私の論理は間違っているように見えるかもしれませんが、良い解決策を見つけることができません。今、私はすべてのページの読み込みでたくさんのクエリを実行することを考えていますが、それは地獄のように遅くなります。

助けてください!:)

4

2 に答える 2

1

あなたのシナリオでは、reduce 関数は次のようになります。

var reduce = function (key, values) {
    var result = 0;

    values.forEach(function (value) {
        result += value;
    });

    return result;
}

それでも機能しない場合はお知らせください。機能する場合は、入力と(間違った)出力の例を教えてください。

于 2012-08-02T08:54:07.617 に答える
1

MRは時々少し遅いです。そのため、2.2 に付属する新しい集計フレームワークを確認することをお勧めします (これは現在リリース段階にあると思います)。

参照: http://docs.mongodb.org/manual/applications/aggregation/

さらに、適切なインデックスを使用してクエリを高速化する必要がある場合があります。または、チャネルにユーザー数を追加し、ユーザーがチャネルに参加/退出するときに増加/減少します。もちろん、アプリのユースケースによって異なります。

于 2012-08-02T09:31:36.693 に答える