文档章节

MongoDB MapReduce使用

一书生
 一书生
发布于 2016/06/30 12:57
字数 559
阅读 87
收藏 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能做稍微复杂一点的统计吗?

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

零点三六
2012/02/13
5K
3
基于 MongoDB 分布式存储进行 MapReduce 并行查询

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

小编辑
2010/11/25
1K
0
PHP与MongoDB:类库、框架与工具介绍

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

kisshua
2012/08/31
0
0
MongoDB:拥有 RDBMS 特性的 NoSQL 数据存储

如果您正在探索 NoSQL 数据库的世界,则 MongoDB(有时被誉为 NoSQL RDBMS)应在您的清单上获得一个位置。了解所有有关 MongoDB 的自定义 API、交互式 shell、RDBMS 类型动态查询的支持、以及...

红薯
2010/12/14
1K
4
MapReduce初探之一~~基于Mongodb实现标签统计

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

zhiweiofli
2013/03/06
0
5

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部