【问题标题】:MongoDB MapReduce : use positional operator $ in map functionMongoDB MapReduce:在地图函数中使用位置运算符 $
【发布时间】:2011-09-06 13:31:00
【问题描述】:

我有一个条目看起来像这样的集合:

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

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

我想在我的 map 函数中做的是发出与数组“contents”中匹配查询的条目对应的字段“value”无需遍历整个数组 .在正常情况下,我可以使用带有 content.$.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" 
    }
    );`

有什么想法吗?

谢谢!

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    如果不遍历整个数组,这将不起作用。在 MongoDB 中,查询旨在匹配整个文档。

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

    M/R 的源代码是here

    即将推出的聚合功能将更符合这一需求。但是这个功能没有时间表。

    【讨论】:

    • 我就是这么想的!谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 2011-09-10
      • 2021-09-18
      • 1970-01-01
      • 2017-01-15
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多