有了存储就会牵扯到查询,虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询。
今天介绍如何基于sharding机制进行mapreduce查询。在MongoDB的官方文档中,这么一句话:
Sharded Environments
In sharded environments, data processing of map/reduce operations runs in parallel on all shards.
即: map/reduce操作会并行运行在所有的shards上。
下面我们就用之前这篇文章中白搭建的环境来构造mapreduce查询:
首先要说的是,基于sharding的mapreduce与非sharding的数据在返回结构上有一些区别,我目前注意到的主要是不支持定制式的json格式的返回数据,也就是下面方式可能会出现问题:
return { count : total };
注意:上面的情况目前出现在了我的测试环境下,如下图:
就需要改成 return count;
下面是测试代码,首先是按帖子id来查询相应数量(基于分组查询实例方式):
public partial class getfile : System.Web.UI.Page { public Mongo Mongo { get; set; } public IMongoDatabase DB { get { return this.Mongo[“dnt_mongodb”]; } } /// /// Sets up the test environment. You can either override this OnInit to add custom initialization. /// public virtual void Init() { string ConnectionString = “Server=10.0.4.85:27017;ConnectTimeout=30000;ConnectionLifetime=300000;MinimumPoolSize=512;MaximumPoolSize=51200;Pooled=true”; if (String.IsNullOrEmpty(ConnectionString)) throw new ArgumentNullException(“Connection string not found.”); this.Mongo = new Mongo(ConnectionString); this.Mongo.Connect(); } string mapfunction = “function(){n” + ” if(this._id==’548111′) { emit(this._id, 1); } n” + ”};”; string reducefunction = “function(key, current ){” + ” var count = 0;” + ” for(var i in current) {” + ” count+=current[i];” + ” }” + ” return count ;n” + ”};”; protected void Page_Load(object sender, EventArgs e) { Init(); var mrb = DB[“posts1”].MapReduce();//attach_gfstream.files int groupCount = 0; using (var mr = mrb.Map(mapfunction).Reduce(reducefunction)) { foreach (Document doc in mr.Documents) { groupCount = int.Parse(doc[“value”].ToString()); } } this.Mongo.Disconnect(); } } |
下面是运行时的查询结果,如下:
接着演示一下如何把查询到的帖子信息返回并装入list集合,这里只查询ID为548110和548111两个帖子:
string mapfunction = “function(){n” + ” if(this._id==’548110’|| this._id==’548111′) { emit(this, 1); } n” + ”};”; string reducefunction = “function(doc, current ){” + ” return doc;n” + ”};”; protected void Page_Load(object sender, EventArgs e) { Init(); var mrb = DB[“posts1”].MapReduce();//attach_gfstream.files List postDoc = new List(); using (var mr = mrb.Map(mapfunction).Reduce(reducefunction)) { foreach (Document doc in mr.Documents) { postDoc.Add((Document)doc[“value”]); } } this.Mongo.Disconnect(); } |
下面是运行时的查询结果,如下:
上面的map/reduce方法还有许多写法,如果大家感兴趣可以看一下如下这些链接:
http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
http://www.mongodb.org/display/DOCS/MapReduce
当然在mongos进行map/reduce运算时,会生成一些临时文件,如下图:
我猜这些临时文件可能会对再次查询系统时的性能有一些提升(但目前未观察到)。
当然对于mongodb的gridfs系统可使用它搭建分布式文件存储系统,我之前已介绍过,我也做了测试,但遗憾的是并未成功,它经常会报一些错误,比如:
Thu Sep 09 12:09:29 Assertion failure _grab clientparallel.cpp 461
看来mapreduce程序链接到mongodb上时,会产生一些问题,但不知道是不是其自身稳定性的原因,还是我的机器环境设置问题(内存或配置的64位系统mongos与32位的client连接问题)。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号

TechTarget
官方微博

TechTarget中国
相关推荐
-
2017年1月数据库流行度排行榜 新年新气象
新年新气象,数据库知识网站DB-engines最近更新了2017年1月份数据库流行度榜单。TechTarget数据库网站将与您分享1月份的榜单排名情况,让我们拭目以待。
-
创建NoSQL数据建模符号 企业架构师亲自上阵
新兴的NoSQL数据风格促使创新的应用程序快速发展,但NoSQL同时也带来了挑战。NoSQL系统能够快速投入生产,有时甚至根本不用创建任何的前期模式。
-
2016年12月数据库流行度排行榜 几家欢乐几家愁
在过去的6个月中,数据库排行榜的前二十名总体上没有太大的变动,那么数据库知识网站DB-engines最近更新的2016年12月份数据库流行度排名情况是否一如既往的沉寂、低调呢?
-
深入理解Amazon DynamoDB NoSQL云数据库服务
Amazon DynamoDB NoSQL云数据库即服务主要为跨移动设备、网页web端、游戏、数字营销和物联网领域的应用提供支持。