2012-11-11 54 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