文档章节

MongoDB MapReduce使用

一书生
 一书生
发布于 2016/06/30 12:57
字数 559
阅读 74
收藏 0
点赞 0
评论 0

项目中需要实现一个分组(GROUP BY)功能,具体逻辑为:
MongoDB中有一个标签(tags)集合,记录了所有标签,当标签被用户使用后,就与特定用户关联(也就是将用户的Id记录到标签上)。要统计标签集合中的各个用户使用的标签列表,可以使用MongoDB的MapReduce方式。

MongoDB的MapReduce命令如下:

db.collection.mapReduce(
	<map>, 
	<reduce>, 
	{
		out: <collection>, 
		query: <document>, 
		sort: <document>, 
		limit: <number>, 
		finalize: <function>,
		scope: <document>,
		jsMode: <boolean>,
		verbose: <boolean>,
		bypassDocumentValidation: <boolean>
	}
)

具体请参考:
https://docs.mongodb.com/manual/reference/method/db.collection.mapReduce/#db.collection.mapReduce

需要实现一个分组的查询:使用MongoDB的MapReduce统计tags集合中用户拥有的标签Id集合。

第一步:创建Map函数

var mapFunction = function() {
	emit(this.userId, this.tagId);
}

注:map函数中的emit函数有两个参数:第一个参数为key,即分组的字段;第二个参数为value,即要统计的字段。

第二步:创建Reduce函数

var reduceFunction = function(key, values) {
	return {userId:key, tagIds:values};
}

第三步:创建执行命令

db.tags.mapReduce(
	mapFunction, 
	reduceFunction, 
	{
		out: "userTags",
		query: {"userId": {"$ne": "0"}}
	}
);

db.userTags.find();

第四步:查看执行结果

MapReduce执行的结果集为:

/* 1 */
{
    "result" : "userTags",
    "timeMillis" : 214.0,
    "counts" : {
        "input" : 29,
        "emit" : 29,
        "reduce" : 3,
        "output" : 4
    },
    "ok" : 1.0,
    "_o" : {
        "result" : "userTags",
        "timeMillis" : 214,
        "counts" : {
            "input" : 29,
            "emit" : 29,
            "reduce" : 3,
            "output" : 4
        },
        "ok" : 1.0
    },
    "_keys" : [ 
        "result", 
        "timeMillis", 
        "counts", 
        "ok"
    ],
    "_db" : {
        "_mongo" : {
            "slaveOk" : true,
            "host" : "192.168.8.225:27017",
            "defaultDB" : "",
            "_readMode" : "commands"
        },
        "_name" : "oncemore"
    },
    "_coll" : {
        "_mongo" : {
            "slaveOk" : true,
            "host" : "192.168.8.225:27017",
            "defaultDB" : "",
            "_readMode" : "commands"
        },
        "_db" : {
            "_mongo" : {
                "slaveOk" : true,
                "host" : "192.168.8.225:27017",
                "defaultDB" : "",
                "_readMode" : "commands"
            },
            "_name" : "oncemore"
        },
        "_shortName" : "userTags",
        "_fullName" : "oncemore.userTags"
    }
}

分组后返回的结果集为:

/* 1 */
{
    "_id" : "65df12b2-75e3-46d7-8ac0-932ef38c49d1",
    "value" : {
        "userId" : "65df12b2-75e3-46d7-8ac0-932ef38c49d1",
        "tagIds" : [ 
            "X$HUS11EY2BUJ95R.-N$KEFF", 
            "I-Z5FQHQ5S2I3A70I9SE212F", 
            "58$.$IQHBSB2HI96LIY9Q7VF"
        ]
    }
}

/* 2 */
{
    "_id" : "78768970-7e45-484a-961e-2ebf47f80f51",
    "value" : {
        "userId" : "78768970-7e45-484a-961e-2ebf47f80f51",
        "tagIds" : [ 
            "RO31AJ6N13IW1YI5ZS9KQ56F", 
            "E1F277.91604M5LI65*E**YF"
        ]
    }
}

/* 3 */
{
    "_id" : "7b5b8bd0-418f-4883-9dee-90e72c56a2b3",
    "value" : "8*O.AW3JY2X.AV1EZJ8G4MQF"
}

/* 4 */
{
    "_id" : "b3bd051a-eb0c-467d-97d2-15a6dc1ceb3d",
    "value" : {
        "userId" : "b3bd051a-eb0c-467d-97d2-15a6dc1ceb3d",
        "tagIds" : [ 
            "NUVA661$MT6M5IT8M$2SUK5F", 
            "KPR.GANUMTYMWRZ92MRAMV6F", 
            "EP6IE3SA0LYFWO9FTYC59OJF", 
            "W-MVECY-VP*7A80WSTZ*LPWF", 
            "7TEP*8SNJNSDL95H.32BZV2F", 
            "VACQEI*FI16INZ73UW6MU3SF", 
            "W3.872XTD6PAI$EIJRY4JBOF", 
            "PEANQXC10BK0F9EJSUT.-67F", 
            "0I$W.DGYBIRXSEQ26QZA0$OF", 
            "7ODQH9C$V66ZFYFLHGZ590-F", 
            "IW58QNPZ.U8WTE1QR5KL9M7F", 
            "QEYG1IJ2EPCNLIHSAE60KYQF", 
            "2KXOZUSJH*XXIZ550OKGHESF", 
            "-D3.-ZXPV.5-K8KW3*PQRN3F", 
            "NUE0W.87P7IVQOT.A1HDN57F", 
            "58.7*CS.Z8ELR3POWY7AQ83F", 
            "5XXORWJ3Z30JXJ96HLATL8TF", 
            "AC63$FTDMMLNRTLR$B60JH$F", 
            "SM73UGZ6SO2JXRWP*0SZNJQF", 
            "AZ8BQ6ADNDZHWY$9PYKJ$V2F", 
            "5XJ27WQSOA4BHO.WQALRD3OF", 
            "3BU98-6K8KHM4UMXENEM647F", 
            "30-9.7E151$O5QRB0XTOMY6F"
        ]
    }
}

可以看出,返回的分组结果集中包含用户的userId以及该用户使用标签的列表。以上示例只是MongoDB MapReduce的一个简单的使用,顺便记录了一下自己使用MongoDB MapReduce的使用步骤。

© 著作权归作者所有

共有 人打赏支持
一书生
粉丝 3
博文 13
码字总数 5030
作品 0
浦东
高级程序员
MapReduce初探之一~~基于Mongodb实现标签统计

MapReduce 是一种编程模型,是 Google 提出的一种软件架构,主要应用于分布式系统上。Google对其原始的定义是“ MapReduce is a framework for computing certain kinds of distributable pr...

zhiweiofli
2013/03/06
0
5
PHP与MongoDB:类库、框架与工具介绍

本文来自MongoDB官方,文中把PHP与MongoDB相关的类库、框架、工具做了汇总和介绍,如果你正使用PHP并在关注MongoDB,那么这篇文章可能对你有用。 架构相关 CakePHP CakePHP是一个非常受欢迎的...

kisshua
2012/08/31
0
0
MongoDB之Hadoop驱动介绍

MongoDB之Hadoop驱动介绍 ------------------------ 1. 一些概念 Hadoop 是一套Apache开源的分布式计算框架,其中包括了分布式文件系统DFS与分布式计算模型MapReduce,而MongoDB是一个面向文...

李长春
2011/09/02
0
1
MongoDB高级一点点的操作

在MongoDB数据库中常见的聚合操作有:count,distinct,group,mapReduce。现在将它们一一的记录下来: 一、count操作 这个操作顾名思义就是达到统计的效果啦,用来统计符合某一种查询条件的...

BravoZu
2014/01/21
0
0
在 EMR 中使用 Mongo-Hadoop

在 EMR 中使用 Mongo-Hadoop Mongo-Hadoop 是 MongoDB 推出的用于 Hadoop 系列组件连接 MongoDB 的组件。其原理跟我们上一篇文章介绍的 ES-Hadoop 类似。EMR 中已经集成了 Mongo-Hadoop,用户...

xy_xind
06/22
0
0
Yum安装MongoDB及数据库管理

MongoDB简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在为WEB应用提供可扩展的高性能数据...

cchenyz
07/13
0
0
MongoDB GroupBy操作, 结果集大小限制问题。

出现问题 公司是做互联网广告投放的,需要统计广告展现量在前五百的域名。最简单粗暴的做法就是group by,根据url分组,然后再sort一下就搞定晒!结果问题就出现了。 如下统计的2015-02-28当...

忙碌的键盘
2015/03/19
0
1
基于MongoDB MapReduce的统计分析

前面已经简单介绍了MongoDB在OECP社区的一个应用:动态消息的设计实现。在上次的应用中,我们只介绍了MongoDB最基本的查询的功能,今天我再介绍一下MongoDB更加高级的应用:用MongoDB做统计分...

菜根乱谭
2012/11/30
0
0
Nosql数据库教程之初探MongoDB - 第一部分

日期:2012/01/16 来源:GBin1.com 大家都听说过nosql解决方案吧?现在是web开发中很流行的技术。 是不是也有听说过MongoDB? 你是不是准备好了来学习一下web开发中最酷的技术之一MongoDB? ...

gbin1
2012/02/06
0
0
MongoDB MapReduce速度提升20倍的优化宝典

摘要:MongoDB提供的MapReduce非常灵活,对于大规模数据分析也相当实用。尽管MongoDB 2.4中MapReduce有了大幅改进,但是相对来说其性能还是有很大的提升空间。本文就来尝试找出让MapReduce速...

Deacyn
2013/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
8分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部