4

クエリでmapReduceコマンドをフィルタリングしようとしています。このクエリは、mapReduceコマンドで使用されていないようです。同じパラメーターでrunCommandを使用すると、クエリフィルターが使用されます。私はmongodb2.2.1と2.0.1を試してみました。

mapReduce関数のクエリが使用されていません。

m = function () {
    if (this.duration > 0) {
    emit("dur", this.duration);
  }
}

r = function (key, values) {
    var index = 0;
    var sum = 0;
    for (var i = 0; i < values.length; i++) {
        sum += values[i];
        index++;
    }
    return sum / index;
}

このコマンドは機能しません:

res = db.movies.mapReduce(m,r, {out: { inline : 1}},{query:{kinds:'Action'}});

{
    "results" : [
            {
                    "_id" : "dur",
                    "value" : 5148.227224559308
            }
    ],
    "timeMillis" : 1849,
    "counts" : {
            "input" : 105472,
            "emit" : 69602,
            "reduce" : 106,
            "output" : 1
    },
    "ok" : 1,
}

このコマンドは機能します:

res = db.runCommand({mapReduce : "movies", map : m, reduce : r, query : {kinds:'Action'}, out : {inline:1} })

{
    "results" : [
            {
                    "_id" : "dur",
                    "value" : 6134.118191572414
            }
    ],
    "timeMillis" : 238,
    "counts" : {
            "input" : 3577,
            "emit" : 2910,
            "reduce" : 4,
            "output" : 1
    },
    "ok" : 1
}

runCommandを使用すると、クエリが使用されます。何か案は ?

4

1 に答える 1

6

outqueryオプションを 1 つのオブジェクトに結合する必要があります。

res = db.movies.mapReduce(m,r, {out: { inline : 1}, query: {kinds: 'Action'} });
于 2012-11-11T17:48:23.763 に答える