2012-11-11 58 views
2

我想用查詢來過濾mapReduce命令。這個查詢看起來不是被mapReduce命令使用的。當我使用具有相同參數的runCommand時,將使用查詢過濾器。我嘗試了一個mongodb 2.2.1和2.0.1。無法在MongoDB中設置查詢過濾器mapReduce命令

我的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

您需要的outquery選項合併成一個單一的對象:

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

謝謝!你救了我的星期日! – nbulteau