文档章节

MongoDB MapReduce使用

一书生
 一书生
发布于 2016/06/30 12:57
字数 559
阅读 77
收藏 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
MongoDB Map Reduce

【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简) Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。 MongoD...

mickelfeng
2017/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中国发布域名系统基础软件 “红枫”

9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软件 “红枫(Maple DNS)”。 9月12日消息,域名工程中心(英文缩写 ZDNS)发布了宣称自主开发的域名系统基础软...

问题终结者
26分钟前
1
0
Shell编程(分发系统介绍、expect远程登录、expect远程执行命令、expect传递参数)

分发系统介绍expect 分发系统expect即分发脚本,是一种脚本语言;通过他可以实现传输,输入命令(上线代码) 应用场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者...

蛋黄_Yolks
31分钟前
1
0
Java Http请求工具类

public static String httpPost(String source, String params) {URL url = null;HttpURLConnection conn = null;OutputStream os = null;String ret = null;try {......

yuewawa
38分钟前
1
0
C++11 智能指针

C++11提供了三个智能指针,std::shared_ptr,std::unique_ptr,std::weak_ptr。最常用的是shared_ptr和unique_ptr。 (1)std::shared_ptr shared_ptr是共享指针,通过在控制块中增加引用计数...

yepanl
38分钟前
1
0
React 服务器渲染原理解析与实践

网盘下载地址 React 服务器渲染原理解析与实践 本套课程,讲解了React中SSR技术的整个搭建思路及流程,完整的从原理上讲清楚了SSR的概念,重点在于讲解编写SSR框架遇到的各种知识点,以及细节...

qq__2304636824
50分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部