MongoDB MapReduce:在map函数中使用位置运算符$

时间:2011-06-01 18:49:18

标签: mongodb mapreduce

我有一个包含如下条目的集合:

{“userid”:1,“contents”:[{“tag”:“whatever”,“value”:100},{“tag”:“whatever2”,“value”:110}]}

我正在使用{“contents.tag”:“whatever”}等查询对此集合执行MapReduce。

我想在我的map函数中做的是发出对应于数组“contents”中与条目匹配的条目的“value”字段,而不必遍历整个数组 。在正常情况下,我可以使用$ positional运算符来执行此操作,例如内容。$。value。但是在MapReduce案例中,它无法正常工作。

总结一下,这是我现在的代码:`

map=function(){
        emit(this.userid, WHAT DO I WRITE HERE TO EMIT THE VALUE I WANT ?);
    }
    reduce=function(key,values){
        return values[0]; //this reduce function does not make sense, just for the example
    }
    res=db.runCommand(
    {
        "mapreduce": "collection",
        "query": {'contents.tag':'whatever'},
        "map": map,
        "reduce": reduce,
        "out": "test_mr" 
    }
    );`

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果不迭代整个数组,这将无法工作。在MongoDB中,查询旨在匹配整个文档。

在处理Map / Reduce时,查询只是修剪传递到map函数的文档数量。但是,map函数不知道运行的查询。这两个是断开的。

M / R周围的源代码是here

即将推出的聚合功能将更贴近这一愿望。但是这个功能没有时间表。

答案 1 :(得分:0)

没办法。我遇到了同样的问题。迭代是必要的。 你可以这样做:

map=function() {
  for(var i in this.contents) {
    if(this.contents[i].tag == "whatever") {
      emit(this.userid, this.contents[i].value);
    }
  } 
}