设为首页 收藏本站
查看: 1033|回复: 0

[经验分享] MongoDB应用篇

[复制链接]

尚未签到

发表于 2015-7-7 11:35:29 | 显示全部楼层 |阅读模式
一、高级查询

1. 查询操作符

1.1 比较操作符$gt,$lt,$gte,$lte

实例:


select * from things where field 3; } db.c1.find(f);
1.11 count查询记录条数,limit限制返回记录数
  count 查询记录条数:



db.users.find().count(); //全collection查询
  注意:以下返回的是user 表中所有的记录数量:



db.users.find().skip(10).limit(5).count();
  如果要返回限制之后的记录数量,要使用count(true)或者count(非0)

1.12 skip限制返回记录的起点
  从第3 条记录开始,返回5 条记录:(limit 3, 5)等价于:



db.users.find().skip(3).limit(5);
1.13 sort 排序
  以年龄升序ascdb.users.find().sort({age: 1});
以年龄降序descdb.users.find().sort({age: -1});

2 游标
  MongoDB 也是用游标来循环处理每一条结果数据,典型用法如下:



for(var cursor=db.users.find();cursor.hasNext()){printjson(cursor.next())};
db.users.find().forEach( function(u) { printjson(u); } );
db.users.find().forEach(printjson);
1.3 存储过程
  MongoDB 同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用javascript 来写的。MongoDB 存储过程是存储在db.system.js 表中的。


  • 第一步是定义函数:function addNumbers(x, y){return x+y;}
  • 第二步是放入js表中:db.system.js.save({_id:"addNumbers",value:addNumbers})或db.system.js.save({_id:"addNumbers",value:function(x,y){return x+y;}})
  • 第三步执行存储过程:db.eval('addNumbers(3,4)');
  

二、Capped Collection

1.简介
  capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。

2.功能特别
  可以插入及更新,但更新不能超出collection 的大小,否则更新失败。不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合。在32 位机上,一个capped collection 的最大值约为482.5M,64 位上只受系统文件大小的限制。

3. 常见用处


  • loggingMongoDB 中日志机制的首选,MongoDB 没有使用日志文件,而是把日志事件存储在数据库中。在一个没有索引的capped collection 中插入对象的速度与在文件系统中记录日志的速度相当。
  • cache缓存一些对象在数据库中,比如计算出来的统计信息。这样的需要在collection 上建立一个索引,因为使用缓存往往是读比写多。
  • auto archiving可以利用capped collection 的age-out 特性,省去了写cron 脚本进行人工归档的工作。

4. 推荐用法


  • 为了发挥capped collection 的最大性能,如果写比读多,最好不要在上面建索引,否则插入速度从"log speed"降为"database speed"。
  • 使用"nature ordering"可以有效地检索最近插入的元素,因为capped collection 能够保证自然排序就是插入时的顺序,类似于log 文件上的tail 操作。

5. 注意事项


  • 可以在创建capped collection 时指定collection 中能够存放的最大文档数。但这时也要指定size,因为总是先检查size 后检查maxRowNumber。可以使用validate()查看一个collection已经使用了多少空间,从而决定size 设为多大。如:db.createCollection("mycoll", {capped:true, size:100000, max:100});db.mycoll.validate();max=1 时会往collection 中存放尽量多的documents。
  • 上述的createCollection 函数也可以用来创建一般的collection , 还有一个参数"autoIndexID",值可以为"true"和"false"来决定是否需要在"_id"字段上自动创建索引,如:db.createCollection("mycoll", {size:10000000, autoIndexId:false})。默认情况下对一般的collection 是创建索引的,但不会对capped collection 创建。
  

三、GridFS
  GridFS 是一种将大型文件存储在MongoDB 数据库中的文件规范。所有官方支持的驱动均实现了GridFS 规范。

1. 为什么使用GridFS?
  由于MongoDB 中BSON 对象大小是有限制的,所以GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。

2. 如何实现海量存储?
  为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk 块对象可被组合保存在一个chunk 块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFS API 的部分或是如何使用mongofiles 工具上。

3. 简单介绍
  GridFS 使用两个表来存储数据:


  • files 包含元数据对象
  • chunks 包含其他一些相关信息的二进制块
  为了使多个GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS 存储将包括命名空间fs.files 和fs.chunks。各种第三方语言的驱动有权限改变这个前缀。

4.命令行工具



mongofiles [-options] [list|search|put|get]
5. 索引



db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});
  这样,一个块就可以利用它的files_id 和 n 的值进行检索。注意,GridFS 仍然可以用findOne得到第一个块,如下:



db.fs.chunks.findOne({files_id: myFileID, n: 0});


四、MapReduce
  MongoDB 的MapReduce 相当于Mysql 中的"group by",所以在MongoDB 上使用 Map/Reduce进行并行"统计"很容易。
  使用MapReduce 要实现两个函数 Map 函数和Reduce 函数,Map 函数调用emit(key, value),遍历collection中所有的记录,将key与value传递给Reduce 函数进行处理。Map函数和Reduce函数可以使用JavaScript 来实现,可以通过db.runCommand 或mapReduce 命令来执行一个MapReduce 的操作:



1 db.runCommand({
2     mapreduce : ,
3     map : ,
4     reduce :
5     [, query : ]
6     [, sort : ]
7     [, limit : ]
8     [, out : ]
9     [, keeptemp: ]
10     [, finalize : ]
11     [, scope : ]
12     [, verbose: ]
13 })


  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84084-1-1.html 上篇帖子: MongoDB学习比较-07 C#驱动操作MongoDB 下篇帖子: 在C#使用MongoDB
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表