MongoDBMapReduce

在用 MongoDB 查询时,若返回的数据量很大,或者做一些比较复杂的统计和聚合操作做花费的时间很长时,可以使用 MongoDB 中的 mapReduce 进行实现。mapReduce 是个灵活且强大的数据聚合工具,它的好处是可以把一个聚合任务分解为多个小的任务,分配到多个服务器上并行处理。

创新互联建站2013年至今,公司以做网站、网站设计、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户1000多家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。

在 MongoDB 中我们可以使用 mapReduce 命令来执行 mapReduce 操作。

mapReduce 命令

在 mapReduce 命令中要实现两个函数,分别是 map 函数和 reduce 函数,其中 map 函数调用 emit(key, value),遍历集合中的所有记录,并将 key 与 value 传递给 reduce 函数进行处理,如下所示:

> db.collection_name.mapReduce(
    function() {emit(key, value);},                  // map 函数
    function(key, values) {return reduceFunction},   // reduce 函数
    {
        out: collection,
        query: document,
        sort: document,
        limit: number
    }
)

参数说明如下:

  • map 函数:一个 javascript 函数,它用一个键映射一个值并发出一个键值对;
  • reduce 函数:一个 javascript 函数,用于减少或分组具有相同键的所有文档;
  • out:指定 map-reduce 查询结果的位置;
  • query:指定用于选择文档的可选选择条件;
  • sort:指定可选的排序条件;
  • limit:指定要返回的最大文档数(可选)。

使用 mapReduce

假如有一个存储用户帖子信息的集合,其中存储了若干用户的用户名、状态等信息,例如下面这样:

{
    "post_text": "编程帮(biancheng.net),一个在线学习编程的网站,专注于分享优质编程教程。",
    "user_name": "bianchengbang",
    "status":"active"
}

接下来在上述的集合中使用 mapReduce 命令来选择集合中所有
"status":"active" 的文档,然后根据用户名对它们进行分组,最后统计每个用户的发帖数量。示例代码如下:

> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
...    query:{status:"active"},
...    out:"post_total"
... }
... )

上面 mapReduce 命令的输出结果如下所示:

{
        "result" : "post_total",
        "timeMillis" : 48,
        "counts" : {
                "input" : 11,
                "emit" : 11,
                "reduce" : 2,
                "output" : 2
        },
        "ok" : 1
}

关于运行结果,有如下几点需要说明:

  • result:储存结果的 collection 的名字,这是个临时集合,mapReduce 的连接关闭后会被自动删除;
  • timeMillis:执行花费的时间,单位为毫秒;
  • input:满足条件被发送到 map 函数的文档个数;
  • emit:在 map 函数中 emit 被调用的次数,也就是所有集合中的数据总量;
  • ouput:结果集合中的文档个数(count 对调试非常有帮助);
  • ok:查询是否执行成功,成功为 1;
  • err:若执行失败,则会在这里显示失败原因。

通过运行结果可以发现,共有 11 个文档与查询匹配(状态为“active”),map 函数生成了 11 个具有键值对的文档,最后 reduce 函数将具有相同键值的映射文档分为 2 个组。

若要查看 mapReduce 查询的结果,可以使用 find 方法,如下所示:

> db.posts.mapReduce(
... function() { emit(this.user_name,1); },
... function(key, values) {return Array.sum(values)},
... {
...    query:{status:"active"},
...    out:"post_total"
... }
... ).find()

上面的查询语句,执行结果如下:

{ "_id" : "biancheng", "value" : 5 }
{ "_id" : "bianchengbang", "value" : 6 }

以类似的方式,mapReduce 查询可用于构造大型复杂的聚合查询,自定义 JavaScript 函数的使用使得 mapReduce 非常灵活和强大。

标题名称:MongoDBMapReduce
当前路径:http://www.gawzjz.com/qtweb/news5/207255.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联