文档章节

MongoDB MapReduce使用

一书生
 一书生
发布于 2016/06/30 12:57
字数 559
阅读 93
收藏 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
浦东
高级程序员
私信 提问
加载中
请先登录后再评论。
MongoDB 的 MapReduce 大数据统计统计挖掘

【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简) MongoDB虽然不像我们常用的mysql,sqlserver,oracle等关系型数据库有group by函数那样方便分组,但是MongoDB要实现分组也有3个办法...

mickelfeng
2017/12/07
0
0
MapReduce初探之一~~基于Mongodb实现标签统计

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

zhiweiofli
2013/03/06
2.3K
5
基于 MongoDB 分布式存储进行 MapReduce 并行查询

之前的文章中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询。虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询...

小编辑
2010/11/25
1.8K
0
MongoDB能做稍微复杂一点的统计吗?

比如类似 select sum(*) ,userType from user group by userType 这样的统计. mongodb的groupby必须有主键, 遇到select sum(*) from user就没辙了 而内置的mapreduce官方说不是实时的,不建议...

零点三六
2012/02/13
5.2K
3
MongoDB工具MagicMongoDBTool使用介绍

MagicMongoDBTool工具是一款MongoDB的数据库管理工具,用来进行简单的数据库管理工作。此工具为国人开发,项目地址:MagicMongoDBTool,目前作者已经完成基本功能开发,借NoSQLFan向各位Mon...

鉴客
2012/04/25
2.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

依赖管理(二):第三方组件库在Flutter中要如何管理

前面的文章中,我介绍了Flutter工程的资源管理机制。在Flutter中,资源采用先声明后使用的机制,在pubspec.yaml显示地声明资源路径后,才可以使用。 对于图片,Flutter基于像素密度,设立不同...

拉维
2019/08/15
0
0
宝塔免费版Nginx防火墙插件来啦,wordpress站长建议开启

之前网上有很多的帖子说宝塔隐藏了免费的自带的防火墙工具,一般用户需要去手动设置和开启,不过纯小白操作还是有点儿麻烦,担心搞错或者不会操作,不过近期看到宝塔应用软件商店上架了一款免...

zouaw建站
2019/11/22
9
0
珍藏已久的 OS 学习网站拿出来分享给大家

点击蓝色“Java建设者”关注我哟 加个“星标”,欢迎来撩 这是程序员cxuan的第 14篇原创文章 平常经常看推荐各种资源教程的,感觉有很多文章稂莠不齐,这次我来推荐点硬核的网站,包你有收获...

cxuaner
05/29
0
0
彤哥说netty系列之IO的五种模型

你好,我是彤哥,本篇是netty系列的第二篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。 何...

彤哥读源码
2019/11/15
0
0
微信屏蔽推广网址的解决思路,微信域名防封技术的实现过程

为什么很多商家在微信封域名如此严格的情况下,还会挤破头皮去做微信营销和推广呢?因为微信营销推广的效率要高于其他社交平台太多,微信的流量裂变的速度也高于其他社交平台,故大家都蜂拥而...

戚馨逸
17分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部